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


«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.


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.


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

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?


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

            }
});

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

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

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

}

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.


-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


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_
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.