XMLではなくコードを使用してImageViewのマージンを設定する方法


177

ImageView余白を付けてレイアウトに不明な数のビューを追加したい。XMLでは、次のlayout_marginように使用できます。

<ImageView android:layout_margin="5dip" android:src="@drawable/image" />

ありますがありImageView.setPadding()ませんImageView.setMargin()。私はそれがの方針に沿っていると思いますがImageView.setLayoutParams(LayoutParams)、それに何をフィードするかわかりません。

誰か知っている?

回答:


381

android.view.ViewGroup.MarginLayoutParamsメソッドがありsetMargins(left, top, right, bottom)ます。直接のサブクラスは以下の通りですFrameLayout.LayoutParamsLinearLayout.LayoutParamsRelativeLayout.LayoutParams

例えば LinearLayout

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
imageView.setLayoutParams(lp);

MarginLayoutParams

これはマージンをピクセルで設定します。スケールするには

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
これはPIXELSのマージンサイズを設定することに注意してください。この質問のxmlのdpi単位と同じではありません。
aromero 2012年

ピクセルの代わりにdpi値をどのように使用できますか?
PascalPiché12年

10
あなたは)(context.getResourcesを使用してピクセル値をスケーリングすることができgetDisplayMetricsを()の密度。。developer.android.com/reference/android/util/...
キー

1
問題があることに注意してください、FrameLayout.LayoutParams:そしておそらく他とstackoverflow.com/questions/5401952/...
ドミトリーZaytsev

画像ビューの下マージンのみを設定したい場合はandroid:layout_centerHorizontal = "true"、どのandroid:layout_alignParentBottom = "true"ようにすればこれを達成できますか?
ssrp 2012年

51
    image = (ImageView) findViewById(R.id.imageID);
    MarginLayoutParams marginParams = new MarginLayoutParams(image.getLayoutParams());
    marginParams.setMargins(left_margin, top_margin, right_margin, bottom_margin);
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
    image.setLayoutParams(layoutParams);

5
最後の2行との取引は何ですか?マージンparamsを別のparams変数に複製しますか?私はそれが必要であることを確認できます:)
Adam Rabung '09

1
画像ビューの下マージンのみを設定したい場合はandroid:layout_centerHorizontal = "true"、どのandroid:layout_alignParentBottom = "true"ようにすればこれを達成できますか?
ssrp 2012年

layoutparams.addRule(RelativeLayout.CENTER_HORIZONTAL);
cwhsu 2014年

別のレイアウトパラメータを作成する必要があります。ありがとう:)
Muzaffer

42

上記の例はすべて、ビューにすでに存在するパラメーターを実際に置き換えますが、これは望ましくない場合があります。以下のコードは、既存のパラメーターを拡張せず、それらを置き換えません。

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);

1
これは、このリストで私にとって有効な最初のソリューションです。他のユーザーは、配置用のRelativeLayoutパラメーターなど、XMLで設定した他のパラメーターを台無しにしました。
Chris Dutrow、2017年

22

ケビンのコードは冗長MarginLayoutParamsオブジェクトを作成します。シンプルなバージョン:

ImageView image = (ImageView) findViewById(R.id.main_image);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(image.getLayoutParams());
lp.setMargins(50, 100, 0, 0);
image.setLayoutParams(lp);

1
奇妙なことに、「setmargins()メソッドを解決できません」というメッセージが表示されたので、この質問をググって検索しました。
user2875404

11

画像ビューのマージンを変更したいが、他のすべてのマージンはそのままにしたい場合。

  1. この場合、画像ビューのMarginLayoutParametersを取得します。 myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. 変更したいマージンを変更するだけで、他はそのままにします。

     marginParams.setMargins(marginParams.leftMargin, 
                             marginParams.topMargin, 
                             150, //notice only changing right margin
                             marginParams.bottomMargin); 

8

dpでマージンを指定する場合は、このメソッドを使用できます。

private void addMarginsInDp(View view, int leftInDp, int topInDp, int rightInDp, int bottomInDp) {
    DisplayMetrics dm = view.getResources().getDisplayMetrics();
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp.setMargins(convertDpToPx(leftInDp, dm), convertDpToPx(topInDp, dm), convertDpToPx(rightInDp, dm), convertDpToPx(bottomInDp, dm));
    view.setLayoutParams(lp);
}

private int convertDpToPx(int dp, DisplayMetrics displayMetrics) {
    float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
    return Math.round(pixels);
}

8

私はこれを単純に使用してうまくいきます:

ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);

setMargins()の単位はdpではなくピクセルです。dpでマージンを設定する場合は、values / dimens.xmlファイルの中に次のようなディメンションを作成します。

<resources>
    <dimen name="right">16dp</dimen>
    <dimen name="left">16dp</dimen>    
</resources>

のようなアクセス:

getResources().getDimension(R.dimen.right);

5

kotlinを使用する場合、拡張関数を作成することでこれを簡略化できます

fun View.setMarginExtensionFunction(left: Int, top: Int, right: Int, bottom: Int) {
  val params = layoutParams as ViewGroup.MarginLayoutParams
  params.setMargins(left, top, right, bottom)
  layoutParams = params
}

これで必要なのはビューだけであり、この拡張関数はどこでも使用できます。

val imageView = findViewById(R.id.imageView)
imageView.setMarginExtensionFunction(0, 0, 0, 0)

1
これはleftとのrightマージンで機能しますが、相対的なマージン(startおよびend)がある場合は機能しません。私はあなたのコードの「改良された」バージョンで要旨を書きました:gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732dsetMarginsRelative関数)-あなたの答えにそれを含めることができますか?
Gabriel De Oliveira Rohden

4

レイアウトを動的に作成し、setmargin()がimageViewで直接機能しないため、そのパラメーターを設定します

ImageView im;
im = (ImageView) findViewById(R.id.your_image_in_XML_by_id);
 RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(im.getLayoutParams());
                        layout.setMargins(counter*27, 0, 0, 0);//left,right,top,bottom
                        im.setLayoutParams(layout);
                        im.setImageResource(R.drawable.yourimage)

4

私にとってこれはうまくいきました:

int imgCarMarginRightPx = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, definedValueInDp, res.getDisplayMetrics());

MarginLayoutParams lp = (MarginLayoutParams) imgCar.getLayoutParams();
lp.setMargins(0,0,imgCarMarginRightPx,0);
imgCar.setLayoutParams(lp);

2

サンプルコードはここにあり、それは非常に簡単です

LayoutParams params1 = (LayoutParams)twoLetter.getLayoutParams();//twoletter-imageview
                params1.height = 70;
                params1.setMargins(0, 210, 0, 0);//top margin -210 here
                twoLetter.setLayoutParams(params1);//setting layout params
                twoLetter.setImageResource(R.drawable.oo);

0

このような方法を使用すると、状況によっては頭痛の種を減らすことができます。マージンを使用したプログラムによるいじりの2つのパスがある場合は、layoutParamsセットがすでにあるかどうかを確認する方が安全です。マージンがすでにある場合は、マージンを増やして置き換えないでください。

public void addMargins(View v, int left, int top, int right, int bottom) {
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
    if (params == null)
        params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                               ViewGroup.LayoutParams.WRAP_CONTENT);
    int oldLeft = params.leftMargin;
    int oldTop = params.topMargin;
    int oldRight = params.rightMargin;
    int oldBottom = params.bottomMargin;
    params.setMargins(oldLeft + left, oldTop + top, oldRight + right, oldBottom + bottom);
    v.setLayoutParams(params);
}

0

以下は、左、上、右、下に8pxのマージンを追加する例です。


ImageView imageView = new ImageView(getApplicationContext());

ViewGroup.MarginLayoutParams marginLayoutParams = new ViewGroup.MarginLayoutParams(
    ViewGroup.MarginLayoutParams.MATCH_PARENT,
    ViewGroup.MarginLayoutParams.WRAP_CONTENT
);

marginLayoutParams.setMargins(8, 8, 8, 8);

imageView.setLayoutParams(marginLayoutParams);

0

2020年からの回答:

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

あなたのコードでそれを簡単に計算してください

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.