2011-01-13 17 views
247
╔══════════════════════════════════════════════╗ ^
║ ImageView ╔══════════════╗    ║ | 
║    ║    ║    ║ | 
║    ║ Actual image ║    ║ | 
║    ║    ║    ║ |60px height of ImageView 
║    ║    ║    ║ | 
║    ║    ║    ║ | 
║    ╚══════════════╝    ║ | 
╚══════════════════════════════════════════════╝ 
<------------------------------------------------> 
        90px width of ImageView 

Ich habe eine Bildansicht mit einigen Standardhöhe und -breite, Bilder werden in db gespeichert und ich möchte Bild nach Imageview Höhe Breite skalieren. Da ich nicht will, gebe ich Standardwerte, denn wenn ich die Höhe und Breite ändere, muss ich es auch im Code ändern.Wie bekomme ich die Breite und Höhe eines android.widget.ImageView?

Ich versuche, die Höhe und Breite von ImageView zu bekommen, aber 0 wird mir in beiden Fällen zurückgegeben.

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

dies gibt mir 0 selbst hat es Standardhöhe und -breite

+268

+1 für ASCII :) – orlp

+154

+1 für +1 für ASCII – Nanne

+0

«Da will ich nicht Ich gebe Standardwerte, denn wenn ich die Höhe und Breite ändere, muss ich es auch im Code ändern »- was kann man ändern? die Bildansicht oder die Bilder gespeichert? –

Antwort

196

Meine Antwort auf this question 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; 
    } 
}); 

Sie können dann Ihre Bildskalierung innerhalb der onPreDraw() -Methode hinzufügen.

+8

sehr schöner Code Bruder und logisch +1 dafür. Sie können dies auch erreichen, indem Sie die ImageView-Eigenschaft android: adjustViewBounds = "true" auf "true" setzen. –

+0

hey, aber während der Debugging-Zeiger nicht auf minParDraw() gehen. Warum ist das so? – Geetanjali

+0

Hallo, das ist großartig, aber wie würde ich Variablen setzen, die ich anderweitig in der Aktivität verwenden kann? Wenn ich Instanzvariablen setze, sind sie erst verfügbar, wenn onCreate beendet ist. – mAndroid

-1

mein Freund durch diese u nicht Höhe in db.but gespeicherten Bild bekommen Sie Ansicht height.for bekommen Höhe des Bildes bekommen u zum erstellen Bitmap aus db, s Bild.Und als u von Höhe und Breite holen kann Imageview

+1

Ich kenne die Höhe und Breite des Bildes, aber ich möchte die Höhe und Breite von ImageView wissen, so dass ich es entsprechend skalieren kann. Ich hoffe, du verstehst meinen Standpunkt. –

4

Ich denke, Sie können das Android OS kümmern sich darum für Sie. Legen Sie den Skalierungstyp in ImageView auf fitXY fest, und das angezeigte Bild wird an die aktuelle Größe der Ansicht angepasst.

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

Der Grund der dimentions des Image ist 0 ist, denn wenn man sich abfragen, hat die Ansicht, die noch nicht das Layout und misst Schritte durchgeführt. Sie haben der Ansicht nur gesagt, wie sie sich im Layout "verhalten" würde, aber sie hat immer noch nicht berechnet, wo sie jede Ansicht platzieren sollen.

Wie entscheiden Sie, wie groß die Bildansicht sein soll? Können Sie nicht einfach eine der nativ implementierten Skalierungsoptionen verwenden?

+0

Ich habe ImageView Standardhöhe und -breite gegeben, aber wenn ich versuche, sie in Code zu bekommen, gibt es mir 0 zurück. Ich denke, ich muss ImageView zuerst aufblasen. aber wie? –

+0

Ich adressiere das in meiner Antwort. Lies es noch einmal :) Ich denke deine Ansicht ist bereits aufgebläht. Können Sie es sehen? Wenn du kannst, dann ist es aufgeblasen. –

24

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

android: adjustViewBounds = "true"

verwenden in Ihrem layout.xml, wo Sie Ihre Image gepflanzt haben: D

+2

funktioniert nicht für mich ... – yehudahs

+3

@jww Ich antworte nicht wirklich auf negative Wähler: p, Lesen Sie zuerst über getWidth und getMeasured in Android-Dokumentation. dann kommen und abstimmen die Leute. –

1

Wenn Sie mehrere Bilder dynamisch als diese versuchen, erstellt haben ein:

// initialisieren Ihre Bilder Array

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

// erstellen programmatisch und Ansicht Mutter

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

hinzufügen // Das ist es. Glückliche Kodierung.

2

Der einfachste Weg ist, um die Breite und Höhe eines Image in onWindowFocusChanged Verfahren der Aktivität

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

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

} 
+1

onWindowFocusChanged nur auf API18 und über, und es kann nicht der beste Weg sein ... aber danke –

9

Post zu dem UI-Thread funktioniert für mich zu bekommen.

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

      } 
}); 
14

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

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

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