195

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

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

ありますがImageView.setPadding()、ありませんImageView.setMargin()。私はそれがの線に沿っていると思いますがImageView.setLayoutParams(LayoutParams)、それに何を与えるべきかわかりません。

誰か知っている?

4

16 に答える 16

400

android.view.ViewGroup.MarginLayoutParamsメソッドがありsetMargins(left, top, right, bottom)ます。直接のサブクラスは、、、FrameLayout.LayoutParamsおよびLinearLayout.LayoutParamsですRelativeLayout.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

于 2010-08-05T15:19:26.287 に答える
53
    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);
于 2011-03-08T07:18:20.850 に答える
45

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

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);
于 2015-09-04T09:26:16.983 に答える
22

Kevinのコードは冗長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);
于 2013-06-15T15:02:48.647 に答える
12

imageviewの余白を変更したいが、他のすべての余白はそのままにしておきたい場合。

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

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

     marginParams.setMargins(marginParams.leftMargin, 
                             marginParams.topMargin, 
                             150, //notice only changing right margin
                             marginParams.bottomMargin); 
    
于 2016-02-18T19:27:24.503 に答える
9

私はこれを単純に使用し、うまく機能します:

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);
于 2015-11-17T04:27:37.170 に答える
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);
}
于 2015-02-05T09:26:09.613 に答える
8

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)
于 2017-09-02T17:51:49.783 に答える
5

2020年からの回答:

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

コードで簡単に計算できます

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
于 2020-05-08T13:11:26.153 に答える
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)
于 2015-04-27T16:56:18.910 に答える
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);
于 2015-06-02T16:19:05.270 に答える
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);
于 2013-10-19T12:19:24.993 に答える
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);
}
于 2017-07-03T01:14:00.720 に答える
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);

于 2019-02-18T10:53:29.350 に答える
0

Kotlinでは、より快適な方法でそれを書くことができます

myView.layoutParams = LinearLayout.LayoutParams(
                RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.WRAP_CONTENT
            ).apply {
                setMargins(12, 12, 12, 12)
            }
于 2020-07-30T11:43:06.393 に答える
0

線形LayoutParamsを作成し、dp値にresources.getDimensionPixelSizeを使用できます。

    val mContext = parent.context
    val mImageView = AppCompatImageView(mContext)
    mImageView.setBackgroundResource(R.drawable.payment_method_selector)

    val height = mContext.resources.getDimensionPixelSize(R.dimen.payment_logo_height)
    val width = mContext.resources.getDimensionPixelSize(R.dimen.payment_logo_width)
    val padding = mContext.resources.getDimensionPixelSize(R.dimen.spacing_small_tiny)
    val margin = mContext.resources.getDimensionPixelSize(R.dimen.spacing_small)

    mImageView.layoutParams = LinearLayout.LayoutParams(width, height).apply {
        setMargins(margin, margin, 0, 0)
    }
    mImageView.setPadding(padding, padding, padding, padding)
于 2020-09-17T11:50:32.177 に答える