Fit image into ImageView, keep aspect ratio and then resize ImageView to image dimensions?

前端 未结 17 871
无人共我
无人共我 2020-11-22 17:07

How to fit an image of random size to an ImageView?
When:

  • Initially ImageView dimensions are 250dp * 250dp
  • The image\'
相关标签:
17条回答
  • 2020-11-22 17:28

    The Best solution that works in most cases is

    Here is an example:

    <ImageView android:id="@+id/avatar"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:scaleType="fitXY"/>
    
    0 讨论(0)
  • 2020-11-22 17:31
    <ImageView android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:scaleType="centerCrop"
               android:adjustViewBounds="true"/>
    
    0 讨论(0)
  • 2020-11-22 17:33

    I needed to have an ImageView and an Bitmap, so the Bitmap is scaled to ImageView size, and size of the ImageView is the same of the scaled Bitmap :).

    I was looking through this post for how to do it, and finally did what I want, not the way described here though.

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/acpt_frag_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/imageBackground"
    android:orientation="vertical">
    
    <ImageView
        android:id="@+id/acpt_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:layout_margin="@dimen/document_editor_image_margin"
        android:background="@color/imageBackground"
        android:elevation="@dimen/document_image_elevation" />
    

    and then in onCreateView method

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.fragment_scanner_acpt, null);
    
        progress = view.findViewById(R.id.progress);
    
        imageView = view.findViewById(R.id.acpt_image);
        imageView.setImageBitmap( bitmap );
    
        imageView.getViewTreeObserver().addOnGlobalLayoutListener(()->
            layoutImageView()
        );
    
        return view;
    }
    

    and then layoutImageView() code

    private void layoutImageView(){
    
        float[] matrixv = new float[ 9 ];
    
        imageView.getImageMatrix().getValues(matrixv);
    
        int w = (int) ( matrixv[Matrix.MSCALE_X] * bitmap.getWidth() );
        int h = (int) ( matrixv[Matrix.MSCALE_Y] * bitmap.getHeight() );
    
        imageView.setMaxHeight(h);
        imageView.setMaxWidth(w);
    
    }
    

    And the result is that image fits inside perfectly, keeping aspect ratio, and doesn't have extra leftover pixels from ImageView when the Bitmap is inside.

    Result

    It's important ImageView to have wrap_content and adjustViewBounds to true, then setMaxWidth and setMaxHeight will work, this is written in the source code of ImageView,

    /*An optional argument to supply a maximum height for this view. Only valid if
     * {@link #setAdjustViewBounds(boolean)} has been set to true. To set an image to be a
     * maximum of 100 x 100 while preserving the original aspect ratio, do the following: 1) set
     * adjustViewBounds to true 2) set maxWidth and maxHeight to 100 3) set the height and width
     * layout params to WRAP_CONTENT. */
    
    0 讨论(0)
  • 2020-11-22 17:35

    Use this code:

    <ImageView android:id="@+id/avatar"
               android:layout_width="fill_parent"
               android:layout_height="match_parent"
               android:scaleType="fitXY" />
    
    0 讨论(0)
  • 2020-11-22 17:35

    I am using a very simple solution. Here my code:

    imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    imageView.getLayoutParams().height = imageView.getLayoutParams().width;
    imageView.setMinimumHeight(imageView.getLayoutParams().width);
    

    My pictures are added dynamically in a gridview. When you make these settings to the imageview, the picture can be automatically displayed in 1:1 ratio.

    0 讨论(0)
  • 2020-11-22 17:37

    Edited Jarno Argillanders answer:

    How to fit Image with your Width and Height:

    1) Initialize ImageView and set Image:

    iv = (ImageView) findViewById(R.id.iv_image);
    iv.setImageBitmap(image);
    

    2) Now resize:

    scaleImage(iv);
    

    Edited scaleImage method: (you can replace EXPECTED bounding values)

    private void scaleImage(ImageView view) {
        Drawable drawing = view.getDrawable();
        if (drawing == null) {
            return;
        }
        Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();
    
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int xBounding = ((View) view.getParent()).getWidth();//EXPECTED WIDTH
        int yBounding = ((View) view.getParent()).getHeight();//EXPECTED HEIGHT
    
        float xScale = ((float) xBounding) / width;
        float yScale = ((float) yBounding) / height;
    
        Matrix matrix = new Matrix();
        matrix.postScale(xScale, yScale);
    
        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();
        BitmapDrawable result = new BitmapDrawable(context.getResources(), scaledBitmap);
    
        view.setImageDrawable(result);
    
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); 
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }
    

    And .xml:

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />
    
    0 讨论(0)
提交回复
热议问题