Como obter a largura e a altura de um android.widget.ImageView?

272
╔══════════════════════════════════════════════╗   ^
 ImageView    ╔══════════════╗                   |
                                               |
               Actual image                    |
                                               |60px height of ImageView
                                               |
                                               |
              ╚══════════════╝                   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

Eu tenho uma visualização de imagem com alguma altura e largura padrão, as imagens são armazenadas em db e eu quero dimensionar a imagem de acordo com a largura da altura do Imageview. Como eu não quero que ele dê valores padrão, porque sempre que eu mudo é altura e largura, também tenho que mudar isso no código.

Estou tentando obter a altura e a largura do ImageView, mas 0 é retornado para mim nos dois casos.

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

isso me retorna 0, mesmo que tenha altura e largura padrão

AZ_
fonte
«Como não quero dar valores padrão, porque sempre que mudo sua altura e largura, também preciso alterá-lo no código» - qual deles pode mudar? a visualização da imagem ou as imagens armazenadas?
Pedro Loureiro
você não pode simplesmente usar android:scaleType="centerInside"?
bigstones
2
@ nightcracker: Isso não é ASCII.
Joey
7
Quando eu disse "ASCII", quis dizer "arte ASCII", que abrange mais arte do que aquela que consiste apenas no conjunto de caracteres ASCII.
orlp
1
Isso não responde diretamente à pergunta, mas se você está se perguntando por que getHeight () / getWidth () está retornando 0, eles sempre retornarão 0 se você chamar esses métodos antes que a exibição seja "desenhada", ou seja, se você chamar esses métodos em onCreate () retornaria 0
audiojared

Respostas:

222

Minha resposta a esta pergunta pode ajudá-lo:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

Você pode adicionar seu trabalho de dimensionamento de imagens no método onPreDraw ().

Kevin Coppock
fonte
8
código muito bom irmão e lógico +1 para isso. você também pode conseguir isto, definindo a propriedade ImageView Android: adjustViewBounds = "true" a verdade :)
AZ_
ei, mas enquanto estiver depurando o ponteiro, não minside em PreDraw (). Por que é assim?
Geetanjali
3
Eu acho que você precisa adicionar vto.removeOnPreDrawListener (this); linha dentro de onPreDraw ()
sagus_helgy 6/10
1
@ KK_07 veja a edição de acordo com o comentário do sofredor. Basta remover o ouvinte depois que você terminar.
Kevin Coppock
6
como você atribui valores a finalHeight e finalWidth dentro de uma classe interna sem torná-los finais?
Chris
29

Acabei de definir essa propriedade e agora o sistema operacional Android está cuidando de tudo.

android: AdjustViewBounds = "true"

Use isso em seu layout.xml onde você plantou seu ImageView: D

AZ_
fonte
4
@jww Eu realmente não respondo a eleitores negativos: p, Leia primeiro sobre getWidth e getMeasured na documentação do Android. então venha e desça votar nas pessoas.
AZ_9
27

Eu conseguia obter largura e altura da imagem pelo seu desenho;

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();
Rashid
fonte
14

A razão pela qual as dimensões do ImageView são 0 é porque, quando você as consulta, a exibição ainda não executou o layout e as etapas de medição. Você disse à visualização apenas como ela se "comportaria" no layout, mas ainda não calculou onde colocar cada visualização.

Como você decide o tamanho a ser dado à visualização da imagem? Você não pode simplesmente usar uma das opções de dimensionamento implementadas nativamente?

Pedro Loureiro
fonte
Dei altura e largura padrão ao ImageView, mas quando tento colocá-las em código, ele retorna 0. Acho que preciso aumentar o ImageView primeiro. mas como?
AZ_ 17/01/11
Abordo isso na minha resposta. Leia novamente :) Acho que sua opinião já está inflada. Você pode ver isso? se você puder, é inflado.
Pedro Loureiro
13

Postar no thread da interface do usuário funciona para mim.

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});
element6
fonte
Realmente util!
Xavi Jimenez
Errado. A consulta de largura e altura da interface do usuário não garante que esses valores estejam prontos. Aconteceu que a inflação da exibição terminou na sua amostra, mas pode muito bem ser o contrário
rommex
6

seu arquivo xml:

 <ImageView android:id="@+id/imageView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/image"
               android:scaleType="fitXY"
               android:adjustViewBounds="true"/>

seu arquivo java:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();
omor
fonte
5

Acho que você pode deixar o sistema operacional Android cuidar disso para você. Defina o tipo de escala no ImageView para fitXYe a imagem exibida será dimensionada para caber no tamanho atual da exibição.

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />
Ian Leslie
fonte
4

A maneira mais simples é obter a largura e a altura de um ImageView no método da atividade onWindowFocusChanged

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}
Aqib
fonte
1
onWindowFocusChanged apenas trabalhar em API18 e mais, e isso não pode ser melhor maneira ... No entanto, graças
Milad gh
1

Se você criou várias imagens dinamicamente, tente esta:

// inicialize sua matriz de imagens

private ImageView myImages[] = new ImageView[your_array_length];

// cria programaticamente e adiciona à visualização principal

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

// É isso aí. Feliz codificação.

Hiren Patel
fonte
-2

meu amigo por isso você não está obtendo a altura da imagem armazenada em db.mas você está obtendo a altura da visualização.para obter a altura da imagem, você precisa criar bitmap a partir da imagem de db, s.and que você pode buscar a altura e a largura da visualização de imagem

chikka.anddev
fonte
2
Conheço a altura e a largura da imagem, mas quero saber a altura e a largura do ImageView para que eu possa dimensioná-lo adequadamente. Eu espero que você entenda meu lado.
AZ_