ImageView genişliğini ve yüksekliğini programlı olarak ayarla?


643

Bir ImageViewgenişliğini ve yüksekliğini programsal olarak nasıl ayarlayabilirim ?


4
Göründüğü kadar garip, bu bilgiyi bulmak oldukça zor. Soru daha fazla oyu hak ediyor.
phunehehe

14
Başka bir platformdan gelenler ile mücadele eden herkes için dipnot. "fit için büyüklüğü ve şekli" seçeneği Android'de güzelce ele alınır; ama bulmak zor. genellikle genişlik eşleştirme üst öğesi , yükseklik kaydırma içeriği, adjustViewBounds açık , ölçek fitToCenter ve cropToPadding false . o zaman otomatiktir. Umarım birine yardım eder!
Fattie

Yanıtlar:


1100

Çok geç olabilir, ancak aynı sorunu olan başkalarının uğruna ImageView yüksekliğini ayarlamak için:

imageView.getLayoutParams().height = 20;

Bu yardımcı olur umarım.

Önemli. Yüksekliği, düzen zaten düzenlendikten sonra ayarlıyorsanız, şunları da aradığınızdan emin olun:

imageView.requestLayout();

102
Yüksekliği, düzen zaten düzenlendikten sonra ayarlıyorsanız, image_view.requestLayout ()
Rhys Davis

9
wrap_content'e ihtiyacım olursa?
Francisco Corrales Morales

8
Oy verin çünkü bir gün patronum oldunuz ve hala sizden öğreniyorum Hakim :)
Sami Eltamawy

9
@FranciscoCorralesMorales wrap_content için bunu kullanın image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Eğer görünüm üst onun LinearLayoutyerine RelativeLayoutonunla
Sami Eltamawy

39
Peki, birimi nasıl belirleyebilirim ? Bu dp değil, sp , vb nasıl
söylenir

231

Resim görünümünüz dinamikse, getLayout'u içeren cevap null istisnayla başarısız olur.

Bu durumda doğru yol:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
iv.setLayoutParams(layoutParams);

7
bu kodu koyarsam görüntüm kaybolur. neden? ImageView imgLogo = yeni ImageView (bu); imgLogo.setImageDrawable (logo); LinearLayout.LayoutParams layoutParams = yeni LinearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Mustafa Güven

3
Bu cevap için teşekkürler, beni doğru yola koy. Eklenen bir not olarak, LinearLayout görüntünün üst görünüm türüne ayarlanmalıdır. Örneğin, resim görünümünüz bir galerideyse, LinearLayout yerine Galeri mizanpajı parametrelerini kullanmalısınız, aksi takdirde döküm istisnalarınız olacaktır.
profexorgeek

3
@ MustafaGüven Seninle aynı problemi yaşadım, ImageViewkayboldum. İşin püf noktası mizanpaj parçasını (yani <this_part_here>.LayoutParams) ebeveyni ile aynı yapmaktır ImageView. Yani, örneğin istemiyorsun, mutfakta annene yerleştirdiğiniz takdirde ImageViewbir mesafede TableRowbir mesafede TableLayout, bunu olarak sahip olmalıdır TableRow.LayoutParams.
user2323030

kullanıcı hakkında ayrıntılı bilgi vermek için ($ some_number) -> LayoutParams'ı üst öğeye göre oluşturmanız ve bunları alt öğeye (imageView) ayarlamanız gerekir, ayrıca requestLayout () yazma sırasında gerekli görünmüyor
Bamboomy

lol yeni params oluşturmak, kötü cevap, sadece mevcut olanları alabilirsiniz, yani bunu yaparsanız (yeni olanlar oluşturmak) o zaman bile xml gerek yok, sonra da programlı olarak imageview oluşturmak / eklemek ...
user924

52

Görevinizi yapmanın bu basit yolu:

setContentView(R.id.main);    
ImageView iv = (ImageView) findViewById(R.id.left);
int width = 60;
int height = 60;
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

ve ekran boyutunu yükseklik ve genişlik vermek istiyorsanız, aşağıdaki kodu kullanın:

setContentView(R.id.main);    
Display display = getWindowManager().getDefaultDisplay();
ImageView iv = (LinearLayout) findViewById(R.id.left);
int width = display.getWidth(); // ((display.getWidth()*20)/100)
int height = display.getHeight();// ((display.getHeight()*30)/100)
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

umut dolu kullanın.


Bu benim için iyi iş !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ekran görüntüsü = getWindowManager (). GetDefaultDisplay (); ImageView iv = (LinearLayout) findViewById (R.id.left); int width = display.getWidth (); // ((display.getWidth () * 20) / 100) int height = display.getHeight (); // ((display.getHeight () * 30) / 100) LinearLayout.LayoutParams parms = yeni LinearLayout.LayoutParams (genişlik ,yükseklik); iv.setLayoutParams (parms);
Selim Raza

İnsanlar intbaşka bir yerde yeniden kullanılmayacaklarsa neden değişkenler bildiriyorlar? Gereksiz görünüyor ama bunun hakkında fazla bir şey bilmiyorum.
n00dles

1
sadece daha iyi anlamak için @ n00dles ,,, başka bir şey
duggu

36

Birlikte bu bir oynamış pixelve dp.

private int dimensionInPixel = 200;

Piksel ile nasıl ayarlanır :

view.getLayoutParams().height = dimensionInPixel;
view.getLayoutParams().width = dimensionInPixel;
view.requestLayout();

Dp tarafından nasıl ayarlanır :

int dimensionInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dimensionInPixel, getResources().getDisplayMetrics());
view.getLayoutParams().height = dimensionInDp;
view.getLayoutParams().width = dimensionInDp;
view.requestLayout();

Umarım bu sana yardımcı olur.


1
Bunu belirli bir dp değeri için nasıl yaparım (yani px'den dp'ye dönüştürme yapmıyorum)?
alxcyl

@Heden getResources (). GetDisplayMetrics () ile ne anlama geliyor, belgeyi okuduğumda DisplayMetrics gibi görünüyor. Bana biraz kısaca açıklar mısınız? Android'de yeniyim, teşekkürler.
Srini

Nedeni: java.lang.NullPointerException: Boş bir nesne başvurusunda 'int android.view.ViewGroup $ LayoutParams.height' alanına yazma girişimi
MD Khali

16

Genişliğinizi veya yüksekliğinizi match_parent(üst öğesi kadar büyük) veya wrap_content(kendi dahili içeriğine uyacak kadar büyük) olarak ayarlamanız gerekiyorsa ViewGroup.LayoutParams, bu iki sabit vardır:

imageView.setLayoutParams(
    new ViewGroup.LayoutParams(
        // or ViewGroup.LayoutParams.WRAP_CONTENT
        ViewGroup.LayoutParams.MATCH_PARENT,      
        // or ViewGroup.LayoutParams.WRAP_CONTENT,     
        ViewGroup.LayoutParams.MATCH_PARENT ) );

Ya da bunları Hakem Zaied'in cevabı gibi ayarlayabilirsiniz :

imageView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
//...

11

Tüm vakalar için değer ayarlayabilirsiniz.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Nedeni: java.lang.NullPointerException: Boş bir nesne başvurusunda 'int android.view.ViewGroup $ LayoutParams.height' alanına yazma girişimi
MD Khali

8

Bir düğmeyi dinamik olarak ayarlamanın en iyi ve en kolay yolu

 Button index=new Button(this);
 int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics());             
 int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, getResources().getDisplayMetrics());

Yukarıdaki yükseklik ve genişlik piksel piksel cinsindendir . 45 dp cinsinden yükseklik ve 42 dp cinsinden genişliktir .

 index.setLayoutParams(new <Parent>.LayoutParams(width, height));

Örneğin, düğmenizi bir TableLayout içindeki TableRow içine yerleştirdiyseniz, TableRow.LayoutParams olarak sahip olmalısınız.

 index.setLayoutParams(new TableRow.LayoutParams(width, height));

8

Bir LayoutParams nesnesi oluşturun ve bunu imageView öğenize atayın

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(150, 150);
imageView.setLayoutParams(params);

5
image_view.getLayoutParams().height 

yükseklik değerini piksel cinsinden döndürür. Değerleri doğru şekilde ayarlamak için önce ekran boyutlarını almanız gerekir.

 Display display = context.getWindowManager().getDefaultDisplay();
 DisplayMetrics outMetrics = new DisplayMetrics();
 display.getMetrics(outMetrics);
 int screen_height = outMetrics.heightPixels;
 int screen_width = outMetrics.widthPixels;

Ekran boyutlarını aldıktan sonra, uygun kenar boşluklarını kullanarak görüntü görüntüleme genişliğini ve yüksekliğini ayarlayabilirsiniz.

 view.getLayoutParams().height = screen_height - 140;
 view.getLayoutParams().width = screen_width - 130 ;

3

ImageView ve Yüksekliği Programlı olarak ayarlamak için şunları yapabilirsiniz:

            //Makesure you calculate the density pixel and multiply it with the size of width/height
            float dpCalculation = getResources().getDisplayMetrics().density;
            your_imageview.getLayoutParams().width = (int) (150 * dpCalculation);

            //Set ScaleType according to your choice...
            your_imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);

2

KOTLIN

val density = Resources.getSystem().displayMetrics.density
view.layoutParams.height = 20 * density.toInt()

1

Widget boyutunun programlı olarak ayarlanması gereken senaryoda aşağıdaki kuralları sağlayın.

  1. LayoutParam Bu görünümü eklediğiniz Düzen için ayarlayın . Benim durumuma ekliyorum bu TableRowyüzden yapmak zorundaydımTableRow.LayoutParams
  2. Bu kodu takip et

final float scale = getResources().getDisplayMetrics().density; int dpWidthInPx = (int) (17 * scale); int dpHeightInPx = (int) (17 * scale);

TableRow.LayoutParams deletelayoutParams = new TableRow.LayoutParams(dpWidthInPx, dpHeightInPx); button.setLayoutParams(deletelayoutParams); tableRow.addView(button, 1);


1
Bunu severim. Onu kullanıyorum! Teşekkürler.
n00dles

0

Görüntüyü yalnızca görüntü görünümüne sığdırmak istiyorsanız, height ve width özelliğinde ölçek türüyle "içeriği kaydır" seçeneğini kullanabilirsiniz, ancak manuel olarak ayarlamak istiyorsanız LayoutParams'ı kullanmanız gerekir.

Layoutparams, mizanpaj yüksekliğini ve genişliğini programlı olarak ayarlamak için etkilidir.


0
int newHeight = 150;
            int newWidth = 150; 
            holder.iv_arrow.requestLayout();
            holder.iv_arrow.getLayoutParams().height = newHeight;
            holder.iv_arrow.getLayoutParams().width = newWidth;
            holder.iv_arrow.setScaleType(ImageView.ScaleType.FIT_XY);
            holder.iv_arrow.setImageResource(R.drawable.video_menu);
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.