Встановити ImageView ширину та висоту програмно?


643

Як я можу програмно встановити ImageViewширину та висоту?


4
Як не дивно це звучить, знайти цю інформацію досить важко. Питання заслуговує на більшу кількість відгуків.
phunehehe

14
Виноска для тих, хто бореться з цим, надходить з іншої платформи. «Розмір і форма , щоб відповідати» варіанту обробляються красиво в Android; але важко знайти. ти, як правило, хочеш, щоб батько збігався з шириною, вміст загортання висоти, увімкнено налаштуванняViewBounds , помилка масштабу fitToCenter та cropToPadding false . то це автоматично. Я дуже сподіваюся, що це комусь допоможе!
Fattie

Відповіді:


1099

Може бути занадто пізно, але заради інших, хто має таку ж проблему, встановити висоту ImageView:

imageView.getLayoutParams().height = 20;

Сподіваюсь, це допомагає.

Важливо. Якщо ви встановлюєте висоту після того, як макет вже був «викладений», переконайтесь, що ви також зателефонували:

imageView.requestLayout();

102
Якщо ви встановлюєте висоту після того, як макет уже був «викладений», переконайтесь, що ви телефонуєте image_view.requestLayout ()
Rhys Davis

9
що робити, якщо мені потрібен wrap_content?
Франсіско Корралес Моралес

8
Голосуйте за те, що одного разу ви були моїм начальником, і я все ще вчуся у вас Хакім :)
Самі Елтамаві

9
@FranciscoCorralesMorales використовувати це для wrap_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Якщо батьківський вигляд LinearLayoutзамінить RelativeLayoutйого
Самі Елтамаві

39
Отже, як вказати одиницю ? Як сказати, що це dp , а не sp , тощо
Saeed Neamati

231

Якщо ваше перегляд зображень динамічне, відповідь, що містить getLayout, буде невдалою з виключенням null.

У цьому випадку правильний спосіб:

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

7
якщо я покладу цей код, моє зображення зникне. чому? ImageView imgLogo = новий ImageView (це); imgLogo.setImageDravable (логотип); LinearLayout.LayoutParams layoutParams = новий LinearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Мустафа Гювен

3
Дякую за цю відповідь, поставте мене на правильний шлях. Як додана примітка, для LinearLayout слід встановити тип батьківського перегляду зображення. Наприклад, якщо ваше зображення перебуває в галереї, вам слід використовувати параметри компонування Галереї замість LinearLayout, або у вас будуть винятки з кастингу.
profexorgeek

3
@ MustafaGüven У мене була така ж проблема, як і у вас, де моя ImageViewзникає. Трюк полягає в тому, щоб зробити макетну частину (тобто <this_part_here>.LayoutParams) такою, якою є батько ImageView. Так, наприклад, якщо ви розмістили своє місце ImageViewв TableRowмежах TableLayout, ви повинні мати його як TableRow.LayoutParams.
user2323030

щоб розробити інформацію про користувача ($ some_number) -> вам потрібно створити LayoutParams відповідно до батьків і встановити їх на дитину (imageView), також requestLayout () не видається потрібним під час написання
Bamboomy

LOL, ви створюєте нові парами, погана відповідь, ви просто можете отримати поточні, я маю на увазі, якщо ви це робите (створюєте нові), то вам навіть xml не потрібен, а потім також створювати / додавати перегляд зображень програмно ...
user924

52

Це простий спосіб виконати своє завдання:

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

і ще один спосіб, якщо ви хочете надати розмір екрану у висоту та ширину, тоді використовуйте код нижче:

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

сподіваюсь, використати повне для вас.


Це для мене прекрасна робота !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Відображення дисплея = 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) , висота); iv.setLayoutParams (parms);
Селім Раза

Чому люди оголошують intзмінні, якщо їх не використовуватимуть в іншому місці? Здається, непотрібним, але я не знаю багато про це, tbh.
n00dles

1
просто для кращого розуміння @ n00dles ,,, нічого іншого
diggu

36

Я грав у цю одну з pixelі dp.

private int dimensionInPixel = 200;

Як встановити піксель :

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

Як встановити dp :

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

Сподіваюся, це допоможе вам.


1
Як би я це зробив для конкретного значення dp (тобто не перетворення з px в dp)?
alxcyl

@Hiren, що означає getResources (). GetDisplayMetrics () коли я читаю документ, це здається DisplayMetrics. Можете, будь ласка, поясніть мені коротко. Я новачок в android, дякую.
Шріні

Викликано: java.lang.NullPointerException: Спроба записати в поле 'int android.view.ViewGroup $ LayoutParams.height' за нульовою посиланням на об'єкт
MD Khali

16

Якщо вам потрібно встановити ширину чи висоту match_parent(такою ж великою, як її батьківська) або wrap_content(достатньо великою, щоб відповідати її власному внутрішньому вмісту), тоді ViewGroup.LayoutParamsє ці дві константи:

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

Або ви можете встановити їх як в Hakem Zaied в відповідь :

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

11

Ви можете встановити значення для всіх випадків.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Викликано: java.lang.NullPointerException: Спроба записати в поле 'int android.view.ViewGroup $ LayoutParams.height' за нульовою посиланням на об'єкт
MD Khali

8

Найкращий і найпростіший спосіб динамічно встановити кнопку

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

Наведена вище висота та ширина - у пікселях px . 45 - висота в dp, а 42 - ширина в dp .

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

Так, наприклад, якщо ви розмістили свою кнопку в TableRow в TableLayout, ви повинні мати її як TableRow.LayoutParams

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

8

Просто створіть об’єкт LayoutParams та призначте його своєму imageView

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

5
image_view.getLayoutParams().height 

повертає значення висоти в пікселях. Для правильного встановлення значень спочатку потрібно отримати розміри екрана.

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

Отримавши розміри екрана, ви можете встановити ширину та висоту перегляду зображення, використовуючи належні поля.

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

3

Щоб програматично встановити ImageView та Height, ви можете зробити це

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


1

У сценарії, коли розмір віджета потрібно задати програмно, дотримуйтесь наведених нижче правил.

  1. Встановіть LayoutParam макет, у який ви додаєте цей вид . У моєму випадку я додаю, щоб TableRowмені довелося це зробитиTableRow.LayoutParams
  2. Дотримуйтесь цього коду

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
Мені це подобається. Я це використовую! Дякую.
n00dles

0

Якщо ви хочете просто встановити зображення у вікні зображення, ви можете використовувати "загортання вмісту" у властивості висоти та ширини у масштабі типу, але якщо ви хочете встановити вручну, ви повинні використовувати LayoutParams.

Layoutparams ефективний для програмного налаштування висоти та ширини макета.


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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.