ImageView fills parent's width OR height, but maintains aspect ratio

后端 未结 7 532
礼貌的吻别
礼貌的吻别 2020-12-04 18:07

I have a square image (though this problem also applies to rectangular images). I want to display the image as large as possible, stretching them if necessary, to fill thei

相关标签:
7条回答
  • 2020-12-04 18:10

    This xml code will work!. If you are specifying that your apps width is always same as the window, then the android:adjustViewBounds="true" will set the height respective to the ration of the image.

            <ImageView
            android:adjustViewBounds="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/screen"/>
    
    0 讨论(0)
  • 2020-12-04 18:18

    Use this code with view layout parameters as wrapcontent

    android:adjustViewBounds="true"

    Hope this it will work.

    0 讨论(0)
  • 2020-12-04 18:19

    These:

    android:layout_height="wrap_content"
    android:scaleType="fitStart"
    android:adjustViewBounds="true"
    

    should resize the image and change the size of the bounds to fit the new image size. If it does not do that on your device post the image you are using and what device you are testing on.

    0 讨论(0)
  • 2020-12-04 18:19

    I had the same issue, android:adjustViewBounds not doing its job and having a padding at the top of the image. Into a relative layout that had match_parent values for the width and the height, I had:

       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical" android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@color/transparent">
    
       <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        android:adjustViewBounds="true" ...
    

    I changed the Relative layout to a Linear layout with wrap_content values for width and height and now it is ok:

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    
    0 讨论(0)
  • 2020-12-04 18:29

    Use this code : android:scaleType="fitXY"

    For more details about image scaling, look what's motioned in this article here

    Summary:

    • center

    Center the image in the view, but perform no scaling

    enter image description here

    • centerCrop

    Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). The image is then centered in the view

    enter image description here

    • centerInside

    Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding)

    enter image description here

    • fitCenter

    enter image description here

    • fitEnd

    enter image description here

    • fitStart

    enter image description here

    • fitXY

    enter image description here

    • matrix

    Scale using the image matrix when drawing

    enter image description here

    more details here new article

    0 讨论(0)
  • 2020-12-04 18:37

    Did you try to adjust it programmaticaly? I think it works really well if you calculate the height of your TextViews and adjust the height and width of the image based on this.

    private void adjustImageView()
    {
        //Get the display dimensions
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
        //TextView name
        TextView name = (TextView) findViewById(R.id.name);
        name.setText("your name text goes here");
        name.measure(0, 0);
    
        //name TextView height
        int nameH = name.getMeasuredHeight();
    
        //TextView name2
        TextView name2 = (TextView) findViewById(R.id.name2);
        name2.setText("your name2 text goes here");
        name2.measure(0, 0);
    
        //name2 TextView height
        int name2H = name2.getMeasuredHeight();
    
        //Original image
        Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    
        //Width/Height ratio of your image
        float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();
    
        //Calculate the new width and height of the image to display 
        int imageToShowHeight = metrics.heightPixels - nameH - name2H;
        int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);
    
        //Adjust the image width and height if bigger than screen
        if(imageToShowWidth > metrics.widthPixels)
        {
            imageToShowWidth = metrics.widthPixels;
            imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
        }
    
        //Create the new image to be shown using the new dimensions 
        Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);
    
        //Show the image in the ImageView
        ImageView image = (ImageView) findViewById(R.id.image);
        image.setImageBitmap(imageToShow);
    }
    
    0 讨论(0)
提交回复
热议问题