我的图像比我希望它适合的容器小。我希望图像能够拉伸,保持其纵横比,使其达到最大可能尺寸。
为了说明这个问题:
<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 here的文档,但无法在那里找到答案。
下图描述了上述代码:
Current behaviour Desired Behaviour
修改
给定ImageView
的{{1}}会准确地扩展/缩小其内部的scaleType="fitCenter"
以尽可能大地增长,同时保持其宽高比。
@drawable
尺寸是在ImageView
以任何方式缩放之前定义的。 @drawable
尺寸不受缩放包含ImageView
的影响。
答案 0 :(得分:7)
<强> XML 强>
XML中唯一的解决方案是尽可能使用"match_parent"
或离散最大值而不是"wrap_content"
。这将确保ImageView
的大小正确,这意味着添加scaleType="fitCenter"
将确保@drawable
将正确缩放。
<强>编程方式强>
这很难看,但是你可以在给尺寸给出离散值后调整ImageView的大小:
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));
}
});
答案 1 :(得分:1)
看起来你想要fitCenter,它使用 Matrix.ScaleToFit CENTER。