it-swarm.com.de

Wie kann ich die Breite und Höhe eines Android.widget.ImageView ermitteln?

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

Ich habe eine Bildansicht mit einer bestimmten Standardhöhe und -breite, Bilder werden in db gespeichert und ich möchte das Bild entsprechend der Höhe und Breite der Bildansicht skalieren. Da ich nicht möchte, dass es Standardwerte gibt, muss ich es bei jeder Änderung von Höhe und Breite auch im Code ändern.

Ich versuche, die Höhe und Breite von ImageView zu ermitteln, 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

269
AZ_

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 mit der onPreDraw () -Methode hinzufügen.

217
kcoppock

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

Android: adjustViewBounds = "true"

Verwenden Sie dies in Ihrer layout.xml, in der Sie Ihre ImageView-Datei gepflanzt haben: D

29
AZ_

Ich konnte Bildbreite und -höhe durch sein zeichnendes erhalten;

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

Der Grund, warum die Abmessungen der ImageView 0 sind, liegt darin, dass die Ansicht beim Abfragen immer noch nicht die Schritte zum Layouten und Messen ausgeführt hat. Sie haben der Ansicht nur mitgeteilt, wie sie sich im Layout "verhalten" würde, aber es wurde 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 ursprünglich implementierten Skalierungsoptionen verwenden?

13
Pedro Loureiro

Post im UI-Thread funktioniert bei mir.

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

            }
});
11
element6

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

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

}
4
Aqib

Ich denke, Sie können das Android) Betriebssystem für Sie erledigen lassen. Setzen Sie den Skalierungstyp in der ImageView auf fitXY und das angezeigte Bild wird an die aktuelle Größe angepasst Größe der Ansicht.

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

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

// initialisieren Ihr Bilderarray

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. Fröhliche Codierung.

1
Hiren Patel