Android ImageView adjusting parent's height and fitting width

前端 未结 5 500
终归单人心
终归单人心 2020-11-28 02:06

Update : I solved this issue by using the method described in this answer

I\'m a bit stuck with this issue, which I think should be pretty simple.

相关标签:
5条回答
  • 2020-11-28 02:21

    You're probably looking for android:adjustViewBounds="true" in xml or imageView.setAdjustViewBounds(true) in Java.

    0 讨论(0)
  • 2020-11-28 02:22

    Thanks to @Julien and @js. Here is complete solution of ImageView that will stretch bitmap height preserving aspect ratio even if bitmap is smaller than ImageView.

    public class ResizableImageView extends ImageView {
    
        public ResizableImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override 
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
             Drawable d = getDrawable();
    
             if(d!=null){
                     // ceil not round - avoid thin vertical gaps along the left/right edges
                     int width = MeasureSpec.getSize(widthMeasureSpec);
                     int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                     setMeasuredDimension(width, height);
             }else{
                     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
             }
        }
    
    }
    

    You can use this class in your xml layouts instead ImageView.

    <com.example.ResizableImageView
        android:id="@+id/banner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/banner" />
    
    0 讨论(0)
  • 2020-11-28 02:34

    As I mentioned in a comment, I subclassed the ImageView. I found my code, here you go :

        protected class ResizableImageView extends ImageView
        {
    
            private Bitmap mBitmap;
    
            // Constructor
    
            public ResizableImageView(Context context)
            {
                super(context);
            }
    
    
            // Overriden methods
    
    
              @Override 
              protected void onMeasure(int widthMeasureSpec,
                      int heightMeasureSpec) {
                  if(mBitmap != null)
                  {
                        int width = MeasureSpec.getSize(widthMeasureSpec);
                        int height = width * mBitmap.getHeight() / mBitmap.getWidth();
                        setMeasuredDimension(width, height);
    
                  } 
                  else
                  {
                      super.onMeasure(widthMeasureSpec,
                              heightMeasureSpec);
                  }
                  }
    
                @Override
                public void setImageBitmap(Bitmap bitmap)
                {
                    mBitmap = bitmap;
                     super.setImageBitmap(bitmap);
                }
    
        }
    
    0 讨论(0)
  • 2020-11-28 02:38

    I think you should change your imgV width to "match_parent"

    You should change the scale type to imgV.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

    0 讨论(0)
  • 2020-11-28 02:38

    I made a slight change to @Seraphim S's solution to account for cases where the image may be wide, and the view's bounds also wide (for example, rotating the device to landscape mode).

    public class ResizableImageView extends ImageView {
        public ResizableImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            Drawable d = getDrawable();
    
            if (d != null) {
    
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = MeasureSpec.getSize(heightMeasureSpec);
    
                if (width >= height) {
                    width = (int) Math.ceil((float) height * (float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight());
                } else {
                    height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                }
    
                setMeasuredDimension(width, height);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题