2013-05-06 40 views
5

Tôi có bố cục tuyến tính đơn giản được sử dụng cho ô của ListView và nó có một lần xem hình ảnh. Hình ảnh sẽ được tải xuống từ internet, do đó kích thước có thể có kích thước khác nhau.Cách tự động thay đổi Độ cao của ImageView

Tuy nhiên, tôi muốn đặt chiều rộng của lần xem hình ảnh thành fill_parent, được cố định và tự động thay đổi chiều cao hình ảnh khi chạy. Quy tắc để đặt chiều cao hình ảnh: nếu tỷ lệ h/w của hình ảnh lớn hơn 1, tạo hình vuông của ImageView, có nghĩa là khớp với chiều cao theo chiều rộng.

nếu tỷ lệ h/w của hình ảnh nhỏ hơn 1, hãy cân tỷ lệ tương ứng. Dự kiến ​​hai mẫu như dưới đây.

Đầu tiên là h/w < 1, trong khi chữ cái thứ hai 'Mèo' là h/w> 1.

enter image description here enter image description here Cảm ơn bạn đã dành thời gian.

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

Trả lời

7

Bạn sẽ cần phải phân lớp ImageView

Override các onMeasure, tôi đã không kiểm tra này, nhưng tất cả các biến bạn cần là có và ý tưởng là chính xác. Bạn chỉ cần thực hiện việc áp dụng tỷ lệ khung hình của hình ảnh với chiều cao điểm ảnh, và nếu nó lớn hơn chiều rộng, hãy đặt nó thành chiều rộng.

@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

Nó có phù hợp với bạn không? –

+0

không, không hoạt động. Cảm ơn anyway –

+0

điều gì xảy ra, vì những cài đặt đó sẽ mở rộng hình ảnh sao cho chiều rộng là tĩnh và độ cao được kéo tương ứng với tỷ lệ khung hình của hình ảnh. –

0

Nơi bạn đang tải imageView trong mã từ url, bạn phải đặt thông số bố cục của ImageView trên đó. Nó sẽ thay đổi kích thước của hình ảnh động.

Sau khi tải hình ảnh, tìm kích thước và tính tỷ lệ và thay đổi kích thước theo điều kiện bạn muốn áp dụng.

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

Tôi có kích thước hình ảnh. Vì vậy, vấn đề, làm thế nào tôi có thể biết những gì chiều cao để thiết lập cho ImageView? Tôi đã làm điều đó thông qua displaymetrics.widthPixels trừ lề tôi đặt trong bố trí xml (dp để px chuyển đổi). Đây có phải là cách tốt nhất? Cảm ơn –

Các vấn đề liên quan