如何在保持纵横比的同时尽可能大地制作图像

我有一个比我想要的容器更小的图像。 我希望图像能够伸展,保持纵横比,尽可能最大。

为了说明这个问题:

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

上面的ImageView将被拉伸以填充容器的宽度。 它包含的@drawable也会沿x轴拉伸,以适应完美的ImageView的宽度。 然而,问题在于,标注为wrap_content的尺寸,在这种情况下是高度,与@drawable的初始高度保持相同的尺寸。

我已经阅读了有关ScaleType的文档, 在这里找不到答案。

下图描述了上面的代码:

在这里输入图像说明在这里输入图像说明

  Current behaviour Desired Behaviour 

编辑

给定scaleType="fitCenter"ImageView将精确地展开/收缩其内部的@drawable ,以保持其纵横比尽可能大。

ImageView的尺寸是在以任何方式缩放@drawable之前定义的。 ImageView尺寸不受缩放包含@drawable

Solutions Collecting From Web of "如何在保持纵横比的同时尽可能大地制作图像"

XML

XML中唯一的解决方法是在可能的情况下使用"match_parent"或离散的最大值而不是"wrap_content" 。 这将确保ImageView是正确的大小,这意味着添加scaleType="fitCenter"将确保@drawable然后将正确缩放。

编程方式

这是丑陋的,但你可以resize后,它的尺寸已被赋予离散值:

  final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver(); thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { private boolean changed = false; @Override public void onGlobalLayout() { if(!changed) { Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams( new LayoutParams( (int) (height * heighToWidthRatio), height)); changed = true; } } }); 

编辑

  final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Remove the GlobalOnLayout Listener so it only fires once. thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this) // Find the images Height to Width ratio Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image. int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams(new LayoutParams( (int) (height * heighToWidthRatio), height)); } }); 

看起来像你想fitCenter,它使用Matrix.ScaleToFit中心 。