Android ImageView大小不随源图像缩放


72

我在LinearLayout中有一些ImageViews。我需要按比例缩小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的宽度是未缩放图像的宽度-实际按比例缩小的图像显示在其ImageViews的左侧。因此,图像之间的差距越来越大。

理想情况下,我希望通过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的高度,以便可以计算自定义图像的必要宽度?

谢谢,如果您已成功阅读了此书。如果您能向我指出解决方案的方向,那就更加感谢!


1
非常感谢,我遇到了一个类似的问题:我想要的只是在应用程序顶部使用全角图片。由于某些未知原因,imageView几乎是图像本身的两倍,从而阻塞了宝贵的屏幕空间。感谢添加android:adjustViewBounds="true"调整图像的高度
dave

@dave很奇怪,android::adjustViewBounds默认情况下未将其设置为true。很高兴您的问题现在已经解决。
韩文

Answers:


265

更改ImageView的使用方式android:layout_height="fill_parent"呢?

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


7
将layout_height更改为fill_parent并没有什么不同,但是将adjustViewBounds设置为true可以解决问题!令我惊讶的是,我已经在各种视图上做了很多工作,以某种方式设法没有注意到该参数!谢谢您:)
Rok

1
我也是。我以为它将默认为true,但是以某种方式从未遇到过此问题。
马修·威利斯,

1
我真的问自己,为什么“ false”是该重要设置的默认值。@MatthewWillis,您今天过得很愉快;)非常感谢。
MarioFraiß13年

快到2015年了,我不知道这个AdjustViewBounds =“ true”的技巧(叹气)。为什么默认情况下这不是事实!我一直在使用ImageView进行大量的批处理,在某些设备中似乎并没有考虑布局的重量...直到找到答案。拯救了我的一天!
Jose_GD 2014年

12

奇怪的是android:layout_height="fill_parent"android:adjustViewBounds="true"并没有帮助。我遇到的问题是图像正在显示,但是图像的顶部排成一排,图像底部排成黑色。设置比例类型对"centerCrop"我有帮助。我想,原因是我的图像尺寸很小。


6

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


6
这解决了我的问题。实际上是android:scaleType="fitXY"+1了.. :)
Mitesh Shah

感谢您的评论@MiteshShah,fitXY最终为我工作!
ehehhh 2015年

0

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

android:scaleType="fitXY"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.