Android ImageView尺寸未按源图像缩放

时间:2011-03-18 16:42:43

标签: android layout formatting imageview custom-view

我在LinearLayout中有一些ImageView。我需要缩小ImageViews,以便它们保持纵横比,同时垂直安装在LinearLayout内部。水平方向,我只需要它们彼此相邻。

我为此制作了一个简化的测试床,它嵌套加权的布局,这样我就可以为ImageViews提供一个宽但不高的LinearLayout -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
        <LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
            <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
            <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>

(在Eclipse布局编辑器中,图像被垂直剪切而根本没有缩放 - 但这只是我们学会爱的那些特质之一)

在硬件上运行时,图像会缩放到正确的高度,同时保留其纵横比。我的问题是他们不是彼此相邻的。每个ImageView的高度正确匹配LinearLayout的高度。每个ImageView的宽度是未缩放图像的宽度 - 实际按比例缩小的图像出现在其ImageView的左侧。因此,我在图像之间会有很大的差距。

理想情况下,我想通过XML来管理这个,但如果不可能,我明白使用自定义视图可能是最好的解决方案。

我尝试创建一个覆盖onMeasure的IconView(扩展ImageView)类,这样我就可以通过根据高度缩放宽度来创建所需大小的图像视图。但传递给函数的parentWidth和parentHeight是屏幕的尺寸而不是LinearLayout容器的尺寸。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  // Calculations followed by calls to setMeasuredDimension, setLayoutParams
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

所以我的问题是 -

1)我可以通过某种方式修改XML以使其满足我的需求吗?

2)如何让我的自定义类获取LinearLayout的高度,以便我可以计算自定义图像的必要宽度?

谢谢,如果你已经成功阅读了这篇文章。非常感谢你能指出我的解决方案!

4 个答案:

答案 0 :(得分:259)

如何更改ImageView以使用android:layout_height="fill_parent"

编辑 - 花了一段时间才找到,但是查看来源帮助我查明了adjustViewBounds。您可能想尝试将android:adjustViewBounds="true"添加到ImageViews。令人惊讶的是,这默认为false。

答案 1 :(得分:11)

奇怪的是android:layout_height="fill_parent"android:adjustViewBounds="true"没有帮助。我遇到的问题是图像显示,但顶部有块行,图像底部有黑色行。将比例类型设置为"centerCrop"对我有帮助。我猜,原因是我的图像尺寸很小。

答案 2 :(得分:6)

我有类似的问题,我的解决方案是在XML布局文件中设置ImageView的android:scaleType="fitEnd"属性。

答案 3 :(得分:0)

是的,我对此的解决方案是:

android:scaleType="fitXY"