2012-03-28 14 views
11

Me gustaría especificar ambos min. ancho/alto y max. ancho/alto para un ImageView. La imagen debe ser escalada para caber.Cómo establecer el tamaño mínimo y máximo para un ImageView en Android

Hacer esto:

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minWidth="100dp" 
    android:maxWidth="200dp" 
    android:minHeight="100dp" 
    android:maxHeight="200dp" 
    android:src="@drawable/ic_launcher" /> 

el min. ancho y alto funcionan como deberían, pero max. ancho y alto son ignorados.

Si fijo android: adjustViewBounds = "true":

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
    android:minWidth="100dp" 
    android:maxWidth="200dp" 
    android:minHeight="100dp" 
    android:maxHeight="200dp" 
    android:src="@drawable/ic_launcher" /> 

que, al máximo. ancho y alto funcionan como deberían, pero mín. ancho y alto son ignorados.

¿Hay alguna manera de tener ambos?

Respuesta

11

Al final, he creado mi propia opinión de que extands ImageView y sobrescribe onMeasure():

public class ResizingImageView extends ImageView { 

    private int mMaxWidth; 
    private int mMaxHeight; 

    public ResizingImageView(Context context) { 
     super(context); 
    } 

    public ResizingImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ResizingImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void setMaxWidth(int maxWidth) { 
     super.setMaxWidth(maxWidth); 
     mMaxWidth = maxWidth; 
    } 

    @Override 
    public void setMaxHeight(int maxHeight) { 
     super.setMaxHeight(maxHeight); 
     mMaxHeight = maxHeight; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     Drawable drawable = getDrawable(); 
     if (drawable != null) { 

      int wMode = MeasureSpec.getMode(widthMeasureSpec); 
      int hMode = MeasureSpec.getMode(heightMeasureSpec); 
      if (wMode == MeasureSpec.EXACTLY || hMode == MeasureSpec.EXACTLY) { 
       return; 
      } 

      // Calculate the most appropriate size for the view. Take into 
      // account minWidth, minHeight, maxWith, maxHeigh and allowed size 
      // for the view. 

      int maxWidth = wMode == MeasureSpec.AT_MOST 
        ? Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth) 
        : mMaxWidth; 
      int maxHeight = hMode == MeasureSpec.AT_MOST 
        ? Math.min(MeasureSpec.getSize(heightMeasureSpec), mMaxHeight) 
        : mMaxHeight; 

      int dWidth = Helpers.dipsToPixels(drawable.getIntrinsicWidth()); 
      int dHeight = Helpers.dipsToPixels(drawable.getIntrinsicHeight()); 
      float ratio = ((float) dWidth)/dHeight; 

      int width = Math.min(Math.max(dWidth, getSuggestedMinimumWidth()), maxWidth); 
      int height = (int) (width/ratio); 

      height = Math.min(Math.max(height, getSuggestedMinimumHeight()), maxHeight); 
      width = (int) (height * ratio); 

      if (width > maxWidth) { 
       width = maxWidth; 
       height = (int) (width/ratio); 
      } 

      setMeasuredDimension(width, height); 
     } 
    } 
} 

Este punto de vista se puede utilizar ahora como:

<my.package.ResizingImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minWidth="100dp" 
    android:maxWidth="200dp" 
    android:minHeight="100dp" 
    android:maxHeight="200dp" 
    android:src="@drawable/ic_launcher" /> 

Esto funciona como quería, pero ¿no debería haber una solución más fácil?

+12

Tienes razón. Estoy cansado de no poder hacer cosas simples con Android. – tasomaniac

0
 <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:minWidth="150dp" 
      android:minHeight="150dp" 
      > 

      <RelativeLayout 
       android:id="@+id/imageLayout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/white" 
       android:layout_gravity="center_vertical" 
       > 

       <ImageView 
        android:id="@+id/image" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:adjustViewBounds="true" 
        android:src="@drawable/trump" 

        /> 

       <ProgressBar 
        android:id="@+id/progressBar" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerInParent="true" 
        android:visibility="gone" /> 
      </RelativeLayout> 
     </LinearLayout> 

Consulte Proporcione la altura y el ancho mínimos al diseño del contenedor y coloque adjustViewBounds en Imageview. De esta forma, su tarea se completará en simples pasos.

Cuestiones relacionadas