Definir largura e altura do ImageView programaticamente?


643

Como posso definir ImageViewa largura e a altura de uma programação?


4
Por mais estranho que pareça, essa informação é bastante difícil de encontrar. A questão merece mais votos positivos.
phunehehe

14
Nota de rodapé para qualquer pessoa que esteja lutando com isso vindo de outra plataforma. a opção "tamanho e forma para caber" é tratada lindamente no Android; mas é difícil de encontrar. você normalmente querem largura jogo pai, o conteúdo altura envoltório, adjustViewBounds ligado , escala fitToCenter e cropToPadding falsa . então é automático. Eu realmente espero que ajude alguém!
Fattie 21/05

Respostas:


1100

Pode ser tarde demais, mas para o bem de outras pessoas com o mesmo problema, defina a altura do ImageView:

imageView.getLayoutParams().height = 20;

Espero que isto ajude.

Importante. Se você estiver definindo a altura após o layout já ter sido 'disposto', lembre-se de ligar para:

imageView.requestLayout();

102
Se você estiver configurando a altura após o layout já foi 'colocado para fora', certifique-se de chamar image_view.requestLayout ()
Rhys Davis

9
e se eu precisar de wrap_content?
Francisco Corrales Morales

8
Votar-se porque um dia você foi meu chefe e eu ainda estou aprendendo com você Hakim :)
Sami Eltamawy

9
@FranciscoCorralesMorales usar isso para wrap_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Se o pai vista é LinearLayoutsubstituir a RelativeLayoutcom ele
Sami Eltamawy

39
Então, como especificar a unidade ? Como dizer que é dp , não sp , etc.
Saeed Neamati

231

Se a visualização da imagem for dinâmica, a resposta que contém getLayout falhará com exceção nula.

Nesse caso, a maneira correta é:

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

7
se eu colocar esse código, minha imagem desaparecerá. porque? ImageView imgLogo = novo ImageView (isto); imgLogo.setImageDrawable (logo); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); row.addView (imgLogo);
Mustafa Güven

3
Obrigado por esta resposta, coloque-me no caminho certo. Como observação adicional, LinearLayout deve ser definido como o tipo de exibição pai da imagem. Por exemplo, se sua visualização de imagem estiver em uma galeria, você deverá usar os parâmetros de layout da Galeria em vez de LinearLayout ou terá exceções de conversão.
Profexorgeek #

3
@ MustafaGüven Eu tive o mesmo problema que você, onde o meu ImageViewdesaparece. O truque é fazer com que a parte do layout (ou seja <this_part_here>.LayoutParams) seja a mesma que o pai da pessoa ImageView. Então, por exemplo, se você colocou seu ImageViewdentro de um TableRowdentro de a TableLayout, deve tê-lo como TableRow.LayoutParams.
precisa saber é o seguinte

para elaborar o usuário ($ some_number) -> você precisa criar os LayoutParams de acordo com o pai e configurá- los no filho (o imageView), também requestLayout () não parece ser necessário no momento da escrita
Bamboomy

lol, você cria novos parâmetros, resposta ruim, você só pode obter os atuais, quero dizer, se você fizer (criar novos), então você nem precisa de xml, e também criar / adicionar imageview programaticamente ...
user924

52

Esta maneira simples de executar sua tarefa:

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

e de outra maneira, se você quiser especificar o tamanho da tela em altura e largura, use o código abaixo:

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

Espero que use completo para você.


Este é um excelente trabalho para mim !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Exibir exibição = getWindowManager (). GetDefaultDisplay (); ImageView iv = (LinearLayout) findViewById (R.id.left); int largura = display.getWidth (); // ((display.getWidth () * 20) / 100) int height = display.getHeight (); // ((display.getHeight () * 30) / 100) LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams (width ,altura); iv.setLayoutParams (parms);
Selim Raza

Por que as pessoas declaram intvariáveis ​​se não serão reutilizadas em outro lugar? Parece desnecessário, mas eu não sei muito sobre isso tbh.
N00dles 11/05/19

1
apenas para melhor compreensão @ n00dles ,,, nada mais
duggu

36

Eu joguei este com pixele dp.

private int dimensionInPixel = 200;

Como definir por pixel :

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

Como definir por dp :

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

Espero que isto te possa ajudar.


1
Como eu faria isso para um valor dp específico (ou seja, não convertendo de px para dp)?
Alxcyl 16/16/16

@ Henry, o que significa getResources (). GetDisplayMetrics () quando li o documento, parece ser DisplayMetrics. Você pode me explicar um pouco? Eu sou novo no android, obrigado.
Srini 30/03

Causado por: java.lang.NullPointerException: tentativa de gravar no campo 'int android.view.ViewGroup $ LayoutParams.height' em uma referência de objeto nulo
MD Khali

16

Se você precisar definir sua largura ou altura para match_parent(tão grande quanto seu pai) ou wrap_content(grande o suficiente para caber em seu próprio conteúdo interno), então existem ViewGroup.LayoutParamsduas constantes:

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

Ou você pode configurá-los como na resposta de Hakem Zaied :

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

11

Você pode definir o valor para todos os casos.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Causada por: java.lang.NullPointerException: tentativa de escrever para o campo 'int android.view.ViewGroup $ LayoutParams.height' em uma referência nula objeto
MD Khali

8

A melhor e mais fácil maneira de definir um botão dinamicamente é

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

A altura e largura acima estão em pixels px . 45 sendo a altura em dp e 42 sendo a largura em dp .

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

Portanto, por exemplo, se você colocou seu botão em um TableRow em um TableLayout, deve tê-lo como TableRow.LayoutParams

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

8

Basta criar um objeto LayoutParams e atribuí-lo ao seu imageView

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

5
image_view.getLayoutParams().height 

retorna o valor da altura em pixels. Você precisa obter as dimensões da tela primeiro para definir os valores corretamente.

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

Depois de obter as dimensões da tela, você pode definir a largura e a altura da visualização de imagem usando as margens adequadas.

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

3

Para definir o ImageView e Height programaticamente, você pode fazer

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

No cenário em que o tamanho do widget precisa ser definido programaticamente, verifique as regras abaixo.

  1. Defina LayoutParam para o Layout no qual você está adicionando essa exibição . No meu caso, eu estou adicionando, TableRowentão eu tive que fazerTableRow.LayoutParams
  2. Siga este código

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
Eu gosto disso. Estou usando isso! Obrigado.
N00dles 11/05/19

0

Se você quiser apenas ajustar a imagem no modo de exibição de imagem, poderá usar o "quebra de conteúdo" na propriedade height e width com o tipo de escala, mas se desejar definir manualmente, precisará usar LayoutParams.

Os parâmetros de layout são eficientes para definir a altura e largura do layout programaticamente.


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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.