2012-03-28 30 views
11

私は両方を指定したいと思います。幅/高さおよび最大。 ImageViewの幅/高さ。イメージは、フィットするようにスケーリングする必要があります。これを行うAndroidのImageViewの最小サイズと最大サイズの両方を設定する方法

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

分。幅と高さは必要に応じて実行されますが、最大です。幅と高さは無視されます。

私はアンドロイド設定した場合:= "true" をadjustViewBounds:より

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

、最大を。幅と高さは必要に応じて実行されますが、最小です。幅と高さは無視されます。

両方の方法がありますか?最後に

答えて

11

、私は)ImageViewのをextandsと(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); 
     } 
    } 
} 

このビューには、今のように使用することができます。これは私が望んでいたとして働く

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

、簡単な解決策はありませんか?

+12

あなたは正しいです。私は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> 

は、コンテナのレイアウトに分の高さと幅を与え、ImageViewの中adjustViewBoundsを入れてください。このようにして、タスクは簡単な手順で完了します。

関連する問題