Wie erhalte ich die Breite und Höhe eines android.widget.ImageView?

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

Ich habe eine Bildansicht mit einer Standardhöhe und -breite, Bilder werden in DB gespeichert und ich möchte das Bild entsprechend der Höhe der Bildansichtshöhe skalieren. Da ich nicht möchte, dass es Standardwerte gibt, muss ich es auch im Code ändern, wenn ich Höhe und Breite ändere.

Ich versuche, die Höhe und Breite von ImageView abzurufen, aber in beiden Fällen wird 0 an mich zurückgegeben.

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

Dies gibt mir 0 zurück, auch wenn es die Standardhöhe und -breite hat

AZ_
quelle
«Da ich keine Standardwerte angeben möchte, muss ich die Höhe und Breite jedes Mal ändern, wenn ich die Höhe und Breite ändere» - welche kann ich ändern? die Bildansicht oder die gespeicherten Bilder?
Pedro Loureiro
kannst du nicht einfach benutzen android:scaleType="centerInside"?
Bigstones
2
@nightcracker: Das ist nicht ASCII.
Joey
7
@ Јοеу Als ich "ASCII" sagte, meinte ich "ASCII-Kunst", die mehr Kunst umfasst als die, die nur aus dem ASCII-Zeichensatz besteht.
Orlp
1
Dies beantwortet die Frage nicht direkt, aber wenn Sie sich fragen, warum getHeight () / getWidth () 0 zurückgeben, geben sie immer 0 zurück, wenn Sie diese Methoden aufrufen, bevor die Ansicht "gezeichnet" wurde, dh wenn Sie es waren Rufen Sie diese Methoden in onCreate () auf, es würde 0 zurückgeben
audiojared

Antworten:

222

Meine Antwort auf diese Frage könnte Ihnen helfen:

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

Anschließend können Sie Ihre Bildskalierungsarbeit über die onPreDraw () -Methode hinzufügen.

Kevin Coppock
quelle
8
sehr netter Code Bruder und logische +1 dafür. Sie können dies auch erreichen, indem Sie die ImageView-Eigenschaft android: adjustViewBounds = "true" auf true setzen :)
AZ_
hey, aber während des Debuggens des Zeigers gehen Sie nicht auf PreDraw (). Warum ist es so?
Geetanjali
3
Ich denke, Sie müssen vto.removeOnPreDrawListener (this) hinzufügen; line inside onPreDraw ()
sagus_helgy
1
@ KK_07 siehe die Bearbeitung gemäß dem Kommentar des Leidenden. Sie müssen nur den Listener entfernen, nachdem Sie damit fertig sind.
Kevin Coppock
6
Wie ordnen Sie finalHeight und finalWidth innerhalb einer inneren Klasse Werte zu, ohne sie endgültig zu machen?
Chris
29

Ich habe gerade diese Eigenschaft festgelegt und jetzt kümmert sich Android OS um alles.

android: adjustViewBounds = "true"

Verwenden Sie dies in Ihrer layout.xml, in die Sie Ihre ImageView gepflanzt haben: D.

AZ_
quelle
4
@jww Ich antworte nicht wirklich auf negative Wähler: p, Lies zuerst über getWidth und getMeasured in der Android-Dokumentation. dann kommen und runter Leute abstimmen.
AZ_
27

Ich konnte Bildbreite und -höhe durch das Zeichnen erhalten;

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

Der Grund, warum die Abmessungen der ImageView 0 sind, liegt darin, dass die Ansicht beim Abfragen immer noch nicht die Layout- und Messschritte ausgeführt hat. Sie haben der Ansicht nur mitgeteilt, wie sie sich im Layout "verhalten" würde, aber sie hat immer noch nicht berechnet, wo die einzelnen Ansichten platziert werden sollen.

Wie legen Sie die Größe für die Bildansicht fest? Können Sie nicht einfach eine der nativ implementierten Skalierungsoptionen verwenden?

Pedro Loureiro
quelle
Ich habe ImageView die Standardhöhe und -breite zugewiesen, aber wenn ich versuche, sie in Code zu integrieren, wird mir 0 zurückgegeben. Ich denke, ich muss ImageView zuerst aufblasen. aber wie geht das?
AZ_
Ich spreche das in meiner Antwort an. Lesen Sie es noch einmal :) Ich denke, Ihre Ansicht ist bereits aufgeblasen. Können Sie es sehen? Wenn du kannst, dann ist es aufgeblasen.
Pedro Loureiro
13

Das Posten im UI-Thread funktioniert für mich.

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
quelle
Wirklich hilfreich!
Xavi Jimenez
Falsch. Das Abfragen von Breite und Höhe über die Benutzeroberfläche garantiert nicht, dass diese Werte bereit sind. Die Ansicht Inflation ist gerade in Ihrer Stichprobe beendet worden, aber es kann sehr gut anders sein
rommex
6

Ihre XML-Datei:

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

Ihre Java-Datei:

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

Ich denke, Sie können das Android-Betriebssystem dies für Sie erledigen lassen. Stellen Sie den Skalentyp in der ImageView auf ein fitXYund das angezeigte Bild wird an die aktuelle Größe der Ansicht angepasst .

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

Am einfachsten ist es, die Breite und Höhe einer ImageView in der onWindowFocusChanged-Methode der Aktivität abzurufen

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

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

}
Aqib
quelle
1
onWindowFocusChanged funktioniert nur mit API18 und höher, und es kann nicht der beste Weg sein ... aber danke
Milad gh
1

Wenn Sie mehrere Bilder dynamisch erstellt haben, versuchen Sie Folgendes:

// Initialisiere dein Bilder-Array

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

// programmgesteuert erstellen und zur übergeordneten Ansicht hinzufügen

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

// Das ist es. Viel Spaß beim Codieren.

Hiren Patel
quelle
-2

Mein Freund, Sie erhalten keine Bildhöhe, die in db gespeichert ist. Sie erhalten jedoch eine Ansichtshöhe. Um eine Bildhöhe zu erhalten, müssen Sie eine Bitmap aus db, s Bild erstellen. Dann können Sie Höhe und Breite der Bildansicht abrufen

chikka.anddev
quelle
2
Ich kenne die Höhe und Breite des Bildes, möchte aber die Höhe und Breite von ImageView kennen, damit ich es entsprechend skalieren kann. Ich hoffe du verstehst meinen Standpunkt.
AZ_