2013-05-06 17 views
5

Mam prosty liniowy układ używany dla komórki ListView i ma obraz. Obraz zostanie pobrany z internetu, więc rozmiar może być różnej wielkości.Jak dynamicznie zmieniać wysokość ImageView Wysokość

Jednak chcę ustawić szerokość widoku obrazu na fill_parent, który jest stały i dynamicznie zmieniać wysokość obrazu w czasie wykonywania. Reguły ustawiania wysokości obrazu: , jeśli stosunek h/w obrazu jest większy niż 1, spraw, aby kwadrat ImageView był zgodny z wysokością do szerokości.

Jeśli stosunek obrazu do rozmiaru jest mniejszy niż 1, należy go proporcjonalnie powiększyć. Oczekiwane dwie próbki, jak poniżej.

Pierwszy to h/w < 1, a drugi "Kot" to h/w> 1.

enter image description here enter image description here Dziękujemy za poświęcony czas.

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

Odpowiedz

7

Musisz podklasy ImageView

przesłonić onMeasure, nie testowałem tego, ale wszystkie zmienne potrzebne są tam i idea jest poprawna. Po prostu zastosuj proporcje obrazu do wysokości obrazków, a jeśli jest większa niż szerokość, ustaw ją na szerokość.

@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

Czy to działa? –

+0

nie, nie działa. Mimo to dziękuję –

+0

co się dzieje, ponieważ te ustawienia skalują obraz w taki sposób, że szerokość jest statyczna, a wysokość jest przyciągana odpowiednio do współczynnika kształtu obrazu. –

0

W miejscu, gdzie jesteś ładowania ImageView w kodzie z adresem URL, trzeba ustawić parametry układu z ImageView tam. Zmieni dynamicznie wymiary obrazu.

Po załadowaniu obrazu znajdź wymiary i obliczyć proporcje i zmień wymiary zgodnie z warunkiem, który chcesz zastosować.

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

Mam rozmiar obrazu. Więc problem, skąd mogę wiedzieć, jaką wysokość ustawić dla ImageView? Zrobiłem to poprzez displaymetrics.widthPixels minus marginesy ustawione w układzie xml (konwersja dp na px). Czy to najlepszy sposób? Dzięki –

Powiązane problemy