Breite und Höhe von ImageView programmgesteuert einstellen?


641

Wie kann ich die ImageViewBreite und Höhe eines Programms programmgesteuert einstellen ?


4
So seltsam es klingt, diese Informationen sind ziemlich schwer zu finden. Die Frage verdient mehr Gegenstimmen.
Phunehehe

14
Fußnote für alle, die damit zu kämpfen haben und von einer anderen Plattform kommen. Die Option "Größe und Form passend" wird in Android wunderbar verarbeitet. aber es ist schwer zu finden. In der Regel möchten Sie, dass die Breite der übergeordneten Elemente, der Inhalt des Höhenumbruchs , " adjustViewBounds" aktiviert , " fitToCenter" und "cropToPadding" auf " false" skaliert werden . dann ist es automatisch. Ich hoffe wirklich, dass es jemandem hilft!
Fattie

Antworten:


1096

Es kann zu spät sein, aber für andere, die das gleiche Problem haben, die Höhe der ImageView festzulegen:

image_view.getLayoutParams().height = 20;

Hoffe das hilft.

Wichtig. Wenn Sie die Höhe einstellen, nachdem das Layout bereits angelegt wurde, rufen Sie auch Folgendes auf:

image_view.requestLayout()

102
Wenn Sie die Höhe einstellen, nachdem das Layout bereits "angelegt" wurde, rufen Sie image_view.requestLayout ()
Rhys Davis

9
Was ist, wenn ich wrap_content benötige?
Francisco Corrales Morales

8
Stimmen Sie ab, weil Sie eines Tages mein Chef waren und ich immer noch von Ihnen lerne Hakim :)
Sami Eltamawy

9
@FranciscoCorralesMorales verwenden dies für wrap_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Wenn das übergeordnete Element der Ansicht LinearLayoutdurch das ersetzt RelativeLayoutwird
Sami Eltamawy

39
Wie spezifiziere ich die Einheit ? Wie sagt man, dass es dp ist , nicht sp usw.
Saeed Neamati

229

Wenn Ihre Bildansicht dynamisch ist, schlägt die Antwort mit getLayout mit einer Null-Ausnahme fehl.

In diesem Fall ist der richtige Weg:

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

7
Wenn ich diesen Code eingebe, verschwindet mein Bild. Warum? ImageView imgLogo = neues ImageView (this); imgLogo.setImageDrawable (Logo); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Mustafa Güven

3
Vielen Dank für diese Antwort, bringen Sie mich auf den richtigen Weg. Als zusätzliche Anmerkung sollte LinearLayout auf den übergeordneten Ansichtstyp des Bildes festgelegt werden. Wenn sich Ihre Bildansicht beispielsweise in einer Galerie befindet, sollten Sie anstelle von LinearLayout die Galerie-Layoutparameter verwenden, da sonst Casting-Ausnahmen auftreten.
Profexorgeek

3
@ MustafaGüven Ich hatte das gleiche Problem wie du, wo mein ImageViewverschwindet. Der Trick besteht darin, den Layout-Teil (dh <this_part_here>.LayoutParams) so zu gestalten, wie er dem übergeordneten Teil des ImageViewist. Wenn Sie beispielsweise Ihr ImageViewinnerhalb eines TableRowinnerhalb eines platziert haben TableLayout, sollten Sie es als haben TableRow.LayoutParams.
user2323030

auszuarbeiten auf Benutzer ($ some_number) -> müssen Sie erstellen die LayoutParams nach den Eltern und setzen sie auf das Kind (die Imageview), auch requestLayout () scheint nicht zum Zeitpunkt des Schreibens notwendig zu sein
Bamboomy

lol Sie erstellen neue Parameter, schlechte Antwort, Sie können nur die aktuellen bekommen, ich meine, wenn Sie es tun (neue erstellen), dann brauchen Sie nicht einmal XML, dann erstellen / fügen Sie Bildansicht programmgesteuert hinzu ...
user924

51

Diese einfache Möglichkeit, Ihre Aufgabe zu erledigen:

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);

und eine andere Möglichkeit, wenn Sie die Bildschirmgröße in Höhe und Breite angeben möchten, verwenden Sie den folgenden Code:

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);

hoffe, nutzen Sie voll für Sie.


Das ist gute Arbeit für mich !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 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 ,Höhe); iv.setLayoutParams (Parms);
Selim Raza

Warum deklarieren Menschen intVariablen, wenn sie nicht anderweitig wiederverwendet werden? Scheint unnötig, aber ich weiß nicht viel darüber.
n00dles

1
Nur zum besseren Verständnis @ n00dles ,,, sonst nichts
duggu

36

Ich habe dieses mit pixelund gespielt dp.

private int dimensionInPixel = 200;

So stellen Sie nach Pixel ein :

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

So stellen Sie mit dp ein :

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

Hoffe das würde dir helfen.


1
Wie würde ich dies für einen bestimmten dp-Wert tun (dh nicht von px nach dp konvertieren)?
Alxcyl

@Hiren, was mit getResources () gemeint ist. GetDisplayMetrics () Wenn ich das Dokument lese, scheint es DisplayMetrics zu sein. Kannst du mir bitte etwas kurz erklären? Ich bin neu bei Android, danke.
Srini

Auslöser: java.lang.NullPointerException: Versuch, in das Feld 'int android.view.ViewGroup $ LayoutParams.height' auf einer Nullobjektreferenz zu schreiben
MD Khali

16

Wenn Sie Ihre Breite oder Höhe auf match_parent(so groß wie das übergeordnete Element) oder wrap_content(groß genug, um auf den eigenen internen Inhalt zu passen ) einstellen müssen, haben Sie ViewGroup.LayoutParamsdiese beiden Konstanten:

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

Oder Sie können sie wie in Hakem Zaieds Antwort einstellen :

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

11

Sie können den Wert für alle Fälle festlegen.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Auslöser: java.lang.NullPointerException: Versuch, in das Feld 'int android.view.ViewGroup $ LayoutParams.height' auf einer Nullobjektreferenz zu schreiben
MD Khali

8

Der beste und einfachste Weg, eine Schaltfläche dynamisch einzustellen, ist

 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());

Die oben angegebene Höhe und Breite sind in Pixel px angegeben . 45 ist die Höhe in dp und 42 ist die Breite in dp .

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

Wenn Sie beispielsweise Ihre Schaltfläche in einer TableRow in einem TableLayout platziert haben, sollten Sie sie als TableRow.LayoutParams haben

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

7

Erstellen Sie einfach ein LayoutParams-Objekt und weisen Sie es Ihrer imageView zu

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

5
image_view.getLayoutParams().height 

Gibt den Höhenwert in Pixel zurück. Sie müssen zuerst die Bildschirmabmessungen ermitteln, um die Werte richtig einzustellen.

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

Nachdem Sie die Bildschirmabmessungen erhalten haben, können Sie die Breite und Höhe der Bildansicht mit den richtigen Rändern festlegen.

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

3

Um ImageView und Höhe programmgesteuert einzustellen, können Sie dies tun

            //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

Stellen Sie in dem Szenario, in dem die Widgetgröße programmgesteuert festgelegt werden muss, die folgenden Regeln sicher.

  1. Legen Sie LayoutParam das Layout fest, in dem Sie diese Ansicht hinzufügen . In meinem Fall füge ich hinzu, TableRowalso musste ich tunTableRow.LayoutParams
  2. Folgen Sie diesem Code

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
Ich mag das. Ich benutze es! Vielen Dank.
n00dles

0

Wenn Sie das Bild nur in die Bildansicht einpassen möchten, können Sie "Inhalt umbrechen" in der Eigenschaft "Höhe und Breite" mit Skalierungstyp verwenden. Wenn Sie jedoch manuell festlegen möchten, müssen Sie LayoutParams verwenden.

Layoutparams ist effizient, um die Höhe und Breite des Layouts programmgesteuert einzustellen.


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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.