Ustawić programowo szerokość i wysokość ImageView?


643

Jak mogę ImageViewprogramowo ustawić szerokość i wysokość?


4
Dziwne, jak się wydaje, ta informacja jest dość trudna do znalezienia. Pytanie zasługuje na więcej pochwał.
phunehehe

14
Przypis dla każdego, kto zmaga się z tym pochodzący z innej platformy. „rozmiar i kształt, aby dopasować” opcja jest obsługiwana pięknie w Android; ale trudno go znaleźć. zazwyczaj chcesz dopasować element nadrzędny do szerokości, zawartość zawijania wysokości, włączyć włączoneViewBounds , przeskalować fitToCenter i cropToPadding false . to jest automatyczne. Naprawdę mam nadzieję, że to komuś pomoże!
Fattie

Odpowiedzi:


1099

Może być za późno, ale ze względu na innych, którzy mają ten sam problem, ustawić wysokość ImageView:

imageView.getLayoutParams().height = 20;

Mam nadzieję że to pomoże.

Ważny. Jeśli ustawiasz wysokość po tym, jak układ został już „ułożony”, upewnij się, że również dzwonisz:

imageView.requestLayout();

102
Jeśli ustawiasz wysokość po tym, jak układ został już „ułożony”, upewnij się, że wywołujesz image_view.requestLayout ()
Rhys Davis

9
co jeśli potrzebuję wrap_content?
Francisco Corrales Morales,

8
Głosuj, bo któregoś dnia byłeś moim szefem, a ja wciąż się od ciebie uczę Hakim :)
Sami Eltamawy

9
@FranciscoCorralesMorales użyj tego dla wrap_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Jeśli rodzic widoku jest LinearLayoutzastąpiony RelativeLayoutnim
Sami Eltamawy

39
Jak więc określić jednostkę ? Jak powiedzieć, że to dp , a nie sp itp.
Saeed Neamati,

231

Jeśli widok obrazu jest dynamiczny, odpowiedź zawierająca getLayout zakończy się niepowodzeniem z wyjątkiem wartości null.

W takim przypadku poprawny sposób to:

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

7
jeśli wstawię ten kod, mój obraz zniknie. dlaczego? ImageView imgLogo = new ImageView (this); imgLogo.setImageDrawable (logo); LinearLayout.LayoutParams layoutParams = nowy LinearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Mustafa Güven

3
Dzięki za odpowiedź, postaw mnie na dobrej drodze. Jako dodatkową notatkę, LinearLayout powinien być ustawiony na nadrzędny typ obrazu. Na przykład, jeśli widok obrazu znajduje się w galerii, powinieneś użyć parametrów układu galerii zamiast LinearLayout, w przeciwnym razie będziesz mieć wyjątki rzutowania.
profexorgeek

3
@ MustafaGüven Miałem ten sam problem co ty, gdzie mój ImageViewznika. Sztuczka polega na tym, aby część układu (tj. <this_part_here>.LayoutParams) Była taka sama, jak element nadrzędny ImageView. Na przykład, jeśli umieściłeś swoje ImageVieww TableRowciągu TableLayout, powinieneś je mieć jako TableRow.LayoutParams.
user2323030,

rozwinąć użytkownika ($ some_number) -> musisz utworzyć LayoutParams według rodzica i ustawić je na dziecku (imageView), również requestLayout () nie wydaje się być konieczne w momencie pisania
Bamboomy

lol tworzysz nowe parametry, zła odpowiedź, po prostu możesz uzyskać bieżące, to znaczy, jeśli to zrobisz (utwórz nowe), wtedy nawet nie potrzebujesz xml, a następnie również programowo utwórz / dodaj
podgląd obrazu

52

Ten prosty sposób na wykonanie zadania:

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

i inny sposób, jeśli chcesz podać rozmiar ekranu w wysokości i szerokości, użyj poniższego kodu:

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

mam nadzieję, że wykorzystasz to dla ciebie.


To jest dla mnie Dobra Praca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Wyświetl 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 (szerokość ,wysokość); iv.setLayoutParams (parms);
Selim Raza,

Dlaczego ludzie deklarują intzmienne, jeśli nie zostaną ponownie użyte w innym miejscu? Wydaje się to niepotrzebne, ale niewiele wiem na ten temat.
n00dles

1
tylko dla lepszego zrozumienia @ n00dles ,,, nic więcej
duggu

36

Grałem w ten z pixeli dp.

private int dimensionInPixel = 200;

Jak ustawić według piksela :

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

Jak ustawić DP :

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

Mam nadzieję, że to ci pomoże.


1
Jak mam to zrobić dla określonej wartości dp (tj. Bez konwersji z px na dp)?
alxcyl

@Hiren, co oznacza getResources (). GetDisplayMetrics (), kiedy czytam dokument, wydaje się, że to DisplayMetrics. Czy możesz mi krótko wyjaśnić. Jestem nowy na Androida, dzięki.
Srini

Przyczyna: java.lang.NullPointerException: Próba zapisu do pola „int android.view.ViewGroup $ LayoutParams.height” w odwołaniu do obiektu o wartości null
MD Khali

16

Jeśli chcesz ustawić szerokość lub wysokość na match_parent(tak duże jak jego rodzic) lub wrap_content(wystarczająco duże, aby zmieściło się w jego wewnętrznej treści), to ViewGroup.LayoutParamsma dwie stałe:

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

Lub można je ustawić jak w hakem Zaied za odpowiedź :

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

11

Możesz ustawić wartość dla wszystkich przypadków.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Przyczyna: java.lang.NullPointerException: Próba zapisu w polu „int android.view.ViewGroup $ LayoutParams.height” w odwołaniu do obiektu o wartości null
MD Khali

8

Najlepszym i najprostszym sposobem na dynamiczne ustawienie przycisku jest

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

Powyższa wysokość i szerokość są w pikselach px . 45 oznacza wysokość w dp, a 42 oznacza szerokość w dp .

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

Na przykład, jeśli umieściłeś przycisk w TableRow w TableLayout, powinieneś mieć go jako TableRow.LayoutParams

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

8

Po prostu stwórz obiekt LayoutParams i przypisz go do swojego imageView

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

5
image_view.getLayoutParams().height 

zwraca wartość wysokości w pikselach. Najpierw musisz uzyskać wymiary ekranu, aby poprawnie ustawić wartości.

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

Po uzyskaniu wymiarów ekranu możesz ustawić szerokość i wysokość widoku obrazu za pomocą odpowiednich marginesów.

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

3

Aby programowo ustawić ImageView i wysokość, możesz to zrobić

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

W scenariuszu, w którym rozmiar widgetu należy ustawić programowo, upewnij się, że obowiązują poniższe reguły.

  1. Ustaw LayoutParam dla układu, w którym dodajesz ten widok . W moim przypadku dodaję, TableRowwięc musiałem to zrobićTableRow.LayoutParams
  2. Postępuj zgodnie z tym kodem

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
Lubię to. Używam tego! Dzięki.
n00dles

0

Jeśli chcesz tylko dopasować obraz do widoku obrazu, możesz użyć opcji „zawijaj zawartość” we właściwości height i width ze skalowaniem, ale jeśli chcesz ustawić ręcznie, musisz użyć LayoutParams.

Layoutparams pozwala programowo ustawić wysokość i szerokość układu.


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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.