ImageView kenar boşluğunu xml değil kod kullanarak ayarlama


177

ImageViewDüzenime kenar boşluğu ile bilinmeyen sayıda görünüm eklemek istiyorum . XML'de şöyle kullanabilirsiniz layout_margin:

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

Var ImageView.setPadding(), ama hayır ImageView.setMargin(). Bence bu doğru ImageView.setLayoutParams(LayoutParams), ama ne besleyeceğinden emin değilim.

Kimse biliyor mu?

Yanıtlar:


381

android.view.ViewGroup.MarginLayoutParamsbir yöntemi vardır setMargins(left, top, right, bottom). Doğrudan alt sınıfları şunlardır: FrameLayout.LayoutParams, LinearLayout.LayoutParamsve RelativeLayout.LayoutParams.

Örneğin 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

Bu, kenar boşluklarını piksel olarak ayarlar. Ölçeklemek için kullanın

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
Bunun PIXELS içindeki kenar boşluğu boyutunu ayarladığını, bu sorunun xml'sindeki dpi birimiyle aynı olmadığını unutmayın.
aromero

Piksel yerine dpi değerini nasıl kullanabiliriz?
Pascal Piché

10
Px değerini context.getResources (). GetDisplayMetrics (). Density developer.android.com/reference/android/util/…
Anahtar

1
Not, FrameLayout.LayoutParamsdiğerleriyle ve belki de başka problemler olabilir : stackoverflow.com/questions/5401952/…
Dmitry Zaytsev

durumda biz ise görüntü görünümünün yalnızca alt kenar boşluğunu ayarlamak istedi android:layout_centerHorizontal = "true"ve android:layout_alignParentBottom = "true"waht şekilde ben bunu başarabilir?
SSRP

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
Son 2 satırdaki anlaşma nedir? marj parametrelerini başka bir params değişkenine klonla? Gerekli olduğunu teyit edebilirim :)
Adam Rabung

1
durumda biz ise görüntü görünümünün yalnızca alt kenar boşluğunu ayarlamak istedi android:layout_centerHorizontal = "true"ve android:layout_alignParentBottom = "true"waht şekilde ben bunu başarabilir?
SSRP

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu

Başka bir düzen parametresi oluşturmak gerekir. Teşekkürler :)
Muzaffer

42

Yukarıdaki tüm örnekler , Görünüm için halihazırda mevcut olan ve istenmeyecek herhangi bir parametreyi DEĞİŞTİRECEKTİR . Aşağıdaki kod, mevcut parametreleri değiştirmeden genişletir:

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

1
Bu listedeki benim için işe yarayan ilk çözüm. Diğerleri, XML'de ayarladığım diğer paramitleri, konumlandırma için RelativeLayout paramitleri de dahil olmak üzere berbat ettiler.
Chris Dutrow

22

Kevin'in kodu gereksiz MarginLayoutParamsnesne oluşturur . Daha basit sürüm:

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
Garip bir şekilde daha sonra "Yöntem setmargins () çözülemiyor" almak bu yüzden bu soru için googled ve buraya indi.
user2875404

11

Görüntü görüntüleme marjını değiştirmek, ancak diğer tüm marjları olduğu gibi bırakmak istiyorsanız.

  1. Bu durumda resim görünümünüzün MarginLayoutParameters'ını alın: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Şimdi değiştirmek istediğiniz marjı değiştirin, ancak diğerlerini olduğu gibi bırakın:

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

8

Dp'de kenar boşlukları belirtmek istemeniz durumunda bu yöntemi kullanabilirsiniz:

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

Ben sadece bunu kullanın ve harika çalışıyor:

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 () birimi dp değil pikseldir. Kenar boşluğunu dp olarak ayarlamak istiyorsanız, değerleri / dimens.xml dosyanızın hemen içinde aşağıdaki gibi boyutlarınızı oluşturun:

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

ve erişim aşağıdaki gibi:

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

5

Kotlin kullanıyorsanız, bu bir uzantı işlevi oluşturarak basitleştirilebilir

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
}

Şimdi tek ihtiyacınız olan bir görünüm ve bu uzantı işlevi her yerde kullanılabilir.

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

1
bu leftve rightkenar boşlukları için geçerlidir, ancak göreli kenar boşluklarınız ( startve end) varsa işe yaramaz. Kodunuzun 'geliştirilmiş' sürümü olan bir öz yazdım : gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d ( setMarginsRelativeişlev) - cevabınıza ekleyebilir misiniz?
Gabriel De Oliveira Rohden

4

düzeni dinamik olarak oluşturun ve parametresini setmargin () öğesi doğrudan bir imageView üzerinde çalışmaz olarak ayarlayın

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

Benim için bu işe yaradı:

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

örnek kod burada, çok kolay

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

Buna benzer bir yöntem kullanmak, bazı durumlarda bazı baş ağrılarından kurtarabilir. Kenar boşluklarıyla iki programlı tinkering geçişiniz varsa, önceden bir layoutParams ayarlanmış olup olmadığını kontrol etmek daha güvenlidir. Zaten bazı marjlar varsa, bir tanesi onları artırmalı ve değiştirmemelidir:

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

Sol, üst, sağ, altta 8 piksel Kenar Boşluğu eklemek için bir örnek.


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

Cevap 2020 yıl:

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

ve sadece kodunuzda cal

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.