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

前端 未结 17 870
无人共我
无人共我 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:39

    I needed to get this done in a constraint layout with Picasso, so I munged together some of the above answers and came up with this solution (I already know the aspect ratio of the image I'm loading, so that helps):

    Called in my activity code somewhere after setContentView(...)

    protected void setBoxshotBackgroundImage() {
        ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view);
    
        if(backgroundImageView != null) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            int width = displayMetrics.widthPixels;
            int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO);
    
            // we adjust the height of this element, as the width is already pinned to the parent in xml
            backgroundImageView.getLayoutParams().height = height;
    
            // implement your Picasso loading code here
        } else {
            // fallback if no element in layout...
        }
    }
    

    In my XML

    <?xml version="1.0" encoding="utf-8"?>
    
    <android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteY="0dp"
    tools:layout_editor_absoluteX="0dp">
    
        <ImageView
            android:id="@+id/background_image_view"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="fitStart"
            app:srcCompat="@color/background"
            android:adjustViewBounds="true"
            tools:layout_editor_absoluteY="0dp"
            android:layout_marginTop="0dp"
            android:layout_marginBottom="0dp"
            android:layout_marginRight="0dp"
            android:layout_marginLeft="0dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
    
        <!-- other elements of this layout here... -->
    
    </android.support.constraint.ConstraintLayout>
    

    Note the lack of a constraintBottom_toBottomOf attribute. ImageLoader is my own static class for image loading util methods and constants.

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

    Use Simple math to resize the image . either you can resize ImageView or you can resize drawable image than set on ImageView . find the width and height of your bitmap which you want to set on ImageView and call the desired method. suppose your width 500 is greater than height than call method

    //250 is the width you want after resize bitmap
    Bitmat bmp = BitmapScaler.scaleToFitWidth(bitmap, 250) ;
    ImageView image = (ImageView) findViewById(R.id.picture);
    image.setImageBitmap(bmp);
    

    You use this class for resize bitmap.

    public class BitmapScaler{
    // Scale and maintain aspect ratio given a desired width
    // BitmapScaler.scaleToFitWidth(bitmap, 100);
     public static Bitmap scaleToFitWidth(Bitmap b, int width)
      {
        float factor = width / (float) b.getWidth();
        return Bitmap.createScaledBitmap(b, width, (int) (b.getHeight() * factor), true);
      }
    
    
      // Scale and maintain aspect ratio given a desired height
      // BitmapScaler.scaleToFitHeight(bitmap, 100);
      public static Bitmap scaleToFitHeight(Bitmap b, int height)
      {
        float factor = height / (float) b.getHeight();
        return Bitmap.createScaledBitmap(b, (int) (b.getWidth() * factor), height, true);
       }
     }
    

    xml code is

    <ImageView
    android:id="@+id/picture"
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:adjustViewBounds="true"
    android:scaleType="fitcenter" />
    
    0 讨论(0)
  • 2020-11-22 17:47

    if it's not working for you then replace android:background with android:src

    android:src will play the major trick

        <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/bg_hc" />
    

    it's working fine like a charm

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

    May not be answer for this specific question, but if someone is, like me, searching for answer how to fit image in ImageView with bounded size (for example, maxWidth) while preserving Aspect Ratio and then get rid of excessive space occupied by ImageView, then the simplest solution is to use the following properties in XML:

        android:scaleType="centerInside"
        android:adjustViewBounds="true"
    
    0 讨论(0)
  • 2020-11-22 17:49

    The Below code make the bitmap perfectly with same size of the imageview. Get the bitmap image height and width and then calculate the new height and width with the help of imageview's parameters. That give you required image with best aspect ratio.

    int currentBitmapWidth = bitMap.getWidth();
    int currentBitmapHeight = bitMap.getHeight();
    
    int ivWidth = imageView.getWidth();
    int ivHeight = imageView.getHeight();
    int newWidth = ivWidth;
    
    newHeight = (int) Math.floor((double) currentBitmapHeight *( (double) new_width / (double) currentBitmapWidth));
    
    Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap, newWidth, newHeight, true);
    
    imageView.setImageBitmap(newbitMap)
    

    enjoy.

    0 讨论(0)
提交回复
热议问题