2013-05-06 21 views
5

Ich habe ein einfaches lineares Layout für ListView-Zelle verwendet, und es hat ein Bildansicht. Das Bild wird aus dem Internet heruntergeladen, so dass die Größe unterschiedliche Größen haben kann.Wie ImageView Höhe dynamisch ändern

Allerdings möchte ich die Breite von Bildansicht zu Fill_parent, die festgelegt ist, festlegen und dynamisch die Bildhöhe zur Laufzeit ändern. Regeln zum Einstellen der Bildhöhe: Wenn das h/w-Verhältnis des Bildes mehr als 1 beträgt, muss das ImageView-Quadrat entsprechend der Höhe an die Breite angepasst werden.

Wenn das h/w-Verhältnis des Bilds kleiner als 1 ist, wird es proportional skaliert. Erwartete zwei Proben wie unten.

Die erste ist h/w < 1, während die zweite 'Katze' h/w> 1 ist.

enter image description here enter image description here Vielen Dank für Ihre Zeit.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:orientation="vertical" 
    android:padding="10dp" > 

     <TextView 
     android:id="@+id/postTitle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:ellipsize="end" 
     android:maxLines="2" 
     android:textColor="@color/black" 
     android:textSize="18sp" 
     android:textStyle="bold" /> 

     <ImageView 
     android:id="@+id/postImg" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:scaleType="centerCrop" 
     android:src="@drawable/dummy_image" 
     android:contentDescription="@string/postImage" /> 
    </LinearLayout> 

Antwort

7

Sie müssen Image

Aufschalten der onMeasure Unterklasse, ich habe nicht getestet, aber alle Variablen, die Sie brauchen, sind da und die Idee ist richtig. Sie führen nur das Seitenverhältnis des Bildes auf die Höhe der Bildansichten aus und wenn es größer als die Breite ist, legen Sie es auf die Breite fest.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    Drawable drawable = getDrawable(); 
    if (drawable != null) 
    { 
     //get imageview width 
     int width = MeasureSpec.getSize(widthMeasureSpec); 


     int diw = drawable.getIntrinsicWidth(); 
     int dih = drawable.getIntrinsicHeight(); 
     float ratio = (float)diw/dih; //get image aspect ratio 

     int height = width * ratio; 

     //don't let height exceed width 
     if (height > width){ 
      height = width; 
     } 


     setMeasuredDimension(width, height);  
    } 
    else 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

} 
+0

Hat es für Sie funktioniert? –

+0

nein, nicht funktionieren. Trotzdem danke –

+0

was passiert, weil diese Einstellungen das Bild so skalieren, dass die Breite statisch ist und die Höhe entsprechend dem Seitenverhältnis des Bildes gezogen wird. –

0

Der Ort, an dem Sie die Imageview in dem Code aus der URL geladen wird, haben Sie dort den Layout-Parameter des Image einzustellen. Es wird die Dimensionen des Bildes dynamisch ändern.

Nach dem Laden des Bildes finden Sie die Abmessungen und berechnen Sie das Verhältnis und ändern Sie die Abmessungen entsprechend der Bedingung, die Sie anwenden möchten.

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,height); 
    imageView.setLayoutParams(layoutParams); 
    //set other properties of the imageview according to your condition 
+0

Ich habe die Bildgröße. Also das Problem, wie kann ich wissen, welche Höhe für das ImageView eingestellt werden soll? Ich habe es über Displaymetrics.widthPixels minus Ränder gemacht, die ich in xml-Layout (dp zu px konvertiert) eingestellt habe. Ist das der beste Weg? Vielen Dank –

Verwandte Themen