Come ottenere la larghezza e l'altezza di un android.widget.ImageView?


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

Ho una vista immagine con altezza e larghezza predefinite, le immagini sono memorizzate in db e voglio ridimensionare l'immagine in base alla larghezza dell'altezza di Imageview. Poiché non lo voglio, fornisce valori predefiniti perché ogni volta che cambio altezza e larghezza devo anche cambiarlo nel codice.

Sto cercando di ottenere l'altezza e la larghezza di ImageView ma 0 mi viene restituito in entrambi i casi.

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

questo mi restituisce 0 anche se ha altezza e larghezza predefinite


«Dato che non voglio fornire valori predefiniti perché ogni volta che cambio altezza e larghezza devo anche cambiarlo nel codice» - quale si può cambiare? la vista dell'immagine o le immagini memorizzate?
Pedro Loureiro,

non puoi semplicemente usare android:scaleType="centerInside"?
pietre preziose

2
@nightcracker: non è ASCII.
Joey,

7
@ Quando ho detto "ASCII" intendevo "arte ASCII", che comprende più arte di quella che consiste semplicemente nel set di caratteri ASCII.
orlp,

1
Questo non risponde direttamente alla domanda, ma se ti stai chiedendo perché getHeight () / getWidth () restituiscono 0, restituiranno sempre 0 se chiami quei metodi prima che la vista sia stata "disegnata", cioè se dovessi chiamare questi metodi in onCreate () restituirà 0
audiojared

Risposte:


222

La mia risposta a questa domanda potrebbe aiutarti:

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

È quindi possibile aggiungere il lavoro di ridimensionamento delle immagini dal metodo onPreDraw ().


8
codice fratello molto bello e +1 logico per quello. puoi ottenere questo risultato anche impostando la proprietà ImageView android: adjustViewBounds = "true" su true :)
AZ_

ehi ma mentre il puntatore di debug non va minimamente su PreDraw (). Perché è così?
Geetanjali,

3
Penso che sia necessario aggiungere vto.removeOnPreDrawListener (questo); line inside onPreDraw ()
sagus_helgy

1
@ KK_07 vedi la modifica secondo il commento di Sufferer. Devi solo rimuovere l'ascoltatore dopo aver finito.
Kevin Coppock,

6
come si assegnano i valori a finalHeight e finalWidth all'interno di una classe interna senza renderli definitivi?
Chris,

29

Ho appena impostato questa proprietà e ora il sistema operativo Android si occupa di tutto.

Android: adjustViewBounds = "true"

Usalo nel tuo layout.xml dove hai installato ImageView: D


4
@jww Non rispondo davvero agli elettori negativi: p, prima leggi su getWidth e getMeasured nella documentazione di Android. poi vieni e scendi vota le persone.
AZ_

27

Potrei ottenere la larghezza e l'altezza dell'immagine dal suo disegno;

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

14

Il motivo per cui le dimensioni di ImageView sono 0 è perché quando si esegue una query, la vista non ha ancora eseguito il layout e le misure. Hai solo detto alla vista come si sarebbe "comportato" nel layout, ma non ha ancora calcolato dove posizionare ciascuna vista.

Come si decide la dimensione da dare alla vista dell'immagine? Non puoi semplicemente usare una delle opzioni di ridimensionamento implementate nativamente?


Ho fornito l'altezza e la larghezza predefinite a ImageView ma quando provo a inserirle nel codice mi restituisce 0. Penso di dover prima gonfiare ImageView. ma come?
AZ_17

Lo affermo nella mia risposta. Rileggilo :) Penso che la tua vista sia già gonfiata. Potete vederlo? se puoi, allora è gonfiato.
Pedro Loureiro,

13

Pubblica nel thread dell'interfaccia utente funziona per me.

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

            }
});

Davvero utile!
Xavi Jimenez,

Sbagliato. Interrogare larghezza e altezza dall'interfaccia utente non garantisce che tali valori siano pronti. L'inflazione vista è appena finita nel tuo campione, ma potrebbe benissimo essere diversamente
rommex

6

il tuo file 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"/>

il tuo file java:

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

5

Penso che puoi lasciare che il sistema operativo Android si occupi di questo per te. Impostare il tipo di scala su ImageView su fitXYe l'immagine visualizzata verrà ridimensionata per adattarsi alla dimensione corrente della vista.

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />

4

Il modo più semplice è ottenere la larghezza e l'altezza di un ImageView nel metodo onWindowFocusChanged dell'attività

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

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

}

1
onWindowFocusChanged funziona solo su API18 e oltre, e non può essere il modo migliore ... comunque grazie
Milad gh

1

Se hai creato più immagini in modo dinamico prova questa:

// inizializza il tuo array di immagini

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

// crea programmaticamente e aggiungi alla vista padre

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

// Questo è tutto. Happy Coding.


-2

amico mio da questo non stai ottenendo l'altezza dell'immagine memorizzata in db. ma stai ottenendo l'altezza della vista. per ottenere l'altezza dell'immagine devi creare bitmap da db, immagine s. e quindi puoi recuperare altezza e larghezza dell'immagine


2
Conosco l'altezza e la larghezza dell'immagine ma voglio conoscere l'altezza e la larghezza di ImageView in modo da poterlo ridimensionare di conseguenza. Spero che tu capisca il mio punto di vista.
AZ_13
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.