如何在ImageView中缩放图像以保持纵横比

mic*_*ael 501 android image-scaling android-imageview

在Android中,我所定义的ImageViewlayout_widthfill_parent(可能需要在电话的全宽).

如果我放的图像ImageView大于layout_width,那么Android会缩放它,对吧?但身高呢?当Android缩放图像时,它会保持纵横比吗?

我发现,ImageView当Android缩放比图像大的图像时,顶部和底部有一些空白区域ImageView.真的吗?如果是,我该如何消除那个空白区?

Ste*_*ley 775

  1. 是的,默认情况下,Android会缩小图像以适应ImageView,从而保持纵横比.但是,请确保使用android:src="..."而不是将图像设置为ImageView android:background="...".src=使其缩放图像保持宽高比,但background=使其缩放扭曲图像,使其完全适合ImageView的大小.(您可以同时使用背景和源,这对于仅使用一个ImageView在主图像周围显示框架等内容非常有用.)

  2. 您还应该看到android:adjustViewBounds使ImageView调整大小以适应重新缩放的图像.例如,如果在通常为方形的ImageView中有矩形图像,adjustViewBounds = true将使ImageView的大小也变为矩形.这会影响其他视图在ImageView周围的布局方式.

    然后,正如Samuh所写,您可以使用android:scaleType参数更改默认缩放图像的方式.顺便说一下,发现它是如何工作的最简单方法就是自己试验一下!请记住查看模拟器本身(或实际手机)中的布局,因为Eclipse中的预览通常是错误的.

  • 这是同样的事情,只是在代码而不是XML中完成.`setImageBitmap`与`android:src ="..."`和`setBackground ...`是`android:background ="..."相同 (18认同)
  • `android:adjustViewBounds`是我拼图的最后一块,谢谢! (18认同)
  • "android:adjustViewBounds"是一个方便的注意事项!如果你不添加它,你很可能会遇到ImageView边框/边界/容器无法正确缩放的问题. (11认同)
  • @SuperUser`mage.setImageDrawable(...)`在xml中也是`android:src ="..."`. (4认同)
  • src= vs background= 对我来说是不同的! (3认同)

小智 276

android:adjustViewBounds.

如果希望ImageView调整其边界以保持其drawable的纵横比,请将此属性设置为true.

  • 这是该问题的正确解决方法.我们在图像视图中有这个,其中高度包括所有这些额外的空白.它不是"透明像素",因为我们有宽度的fill_parent和高度的wrap_content.如果您没有adjustViewBounds = true,那么您将获得额外的空格.在将其设置为true后,我们的问题就消失了.谢谢! (6认同)
  • 谢谢,这个并设置为src而不是背景工作完美! (3认同)

Kev*_*ker 162

对于有这个特殊问题的其他人.您有一个ImageView(或其他View)想要的宽度fill_parent和高度按比例缩放:

将以下两个属性添加到您的ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"
Run Code Online (Sandbox Code Playgroud)

并将ImageView宽度设置为fill_parent和高度wrap_content.

此外,如果您不希望裁剪图像,请尝试以下操作:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"
Run Code Online (Sandbox Code Playgroud)

  • 是的但你的图像被裁剪了.完美的解决方案将拉伸到宽度,保持纵横比,而不是裁剪.我不知道为什么要这么做... (15认同)
  • 凯文,你所说的正是我所寻找的,如果图像的大小小于屏幕的大小,它会放大并居中,完美.谢谢. (2认同)

小智 54

如果您希望ImageView在保持适当的宽高比的同时向上和向下扩展,请将其添加到XML:

android:adjustViewBounds="true"
android:scaleType="fitCenter"
Run Code Online (Sandbox Code Playgroud)

将其添加到您的代码中:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);
Run Code Online (Sandbox Code Playgroud)

我需要一段时间才能完成这项工作,但这似乎适用于图像小于屏幕宽度且大于屏幕宽度的情况,并且它不会对图像进行包装.


Mik*_*679 13

这对我有用:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
Run Code Online (Sandbox Code Playgroud)


Jee*_*eet 11

这就是它在 ConstraintLayout 中对我的工作方式:

<ImageView
    android:id="@+id/myImg"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"/>
Run Code Online (Sandbox Code Playgroud)

然后在代码中,我将 drawable 设置为:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));
Run Code Online (Sandbox Code Playgroud)

这根据其纵横比很好地适合图像并将其保持在中心。


Muk*_*mar 8

下面的代码工作比例图像作为宽高比:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
Run Code Online (Sandbox Code Playgroud)


小智 8

这解决了我的问题

android:adjustViewBounds="true"
android:scaleType="fitXY"
Run Code Online (Sandbox Code Playgroud)


Sam*_*muh 7

看一下ImageView.ScaleType来控制和理解调整大小的方式ImageView.调整图像大小(同时保持其纵横比)时,图像的高度或宽度可能会小于ImageView尺寸.


hal*_*ate 5

我的图像比屏幕小。为了让它按比例拉伸到最大值并在视图中居中,我必须使用以下代码:

<ImageView
    android:id="@+id/my_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:layout_weight="1"
    android:scaleType="fitCenter" />
Run Code Online (Sandbox Code Playgroud)

但是请记住,如果您有一个相对布局并且将某些元素设置在 ImageView 上方或下方,它们很可能会与图像重叠。


Ati*_*ood 5

在ImageView中使用这些属性以保持纵横比:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />
Run Code Online (Sandbox Code Playgroud)


dev*_*mit 5

如果图像质量下降:使用

android:adjustViewBounds="true"
Run Code Online (Sandbox Code Playgroud)

代替

android:adjustViewBounds="true"
android:scaleType="fitXY"
Run Code Online (Sandbox Code Playgroud)