Android ImageView 大小不随源图像缩放

Posted

技术标签:

【中文标题】Android ImageView 大小不随源图像缩放【英文标题】:Android ImageView size not scaling with source image 【发布时间】:2011-07-18 07:52:51 【问题描述】:

我在 LinearLayout 中有几个 ImageView。我需要按比例缩小 ImageView,以便它们保持纵横比,同时垂直适合 LinearLayout。在水平方向上,我只需要它们彼此相邻。

我为此制作了一个简化的测试台,它嵌套了加权布局,因此我有一个宽但不是很高的 ImageView 线性布局 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_ android:layout_>
    <LinearLayout android:id="@+id/linearLayout1" android:layout_ android:layout_ android:layout_weight="5">
        <LinearLayout android:id="@+id/linearLayout3" android:layout_ android:layout_ android:layout_weight="1">
            <ImageView android:id="@+id/imageView1" android:layout_ android:layout_ android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
            <ImageView android:id="@+id/imageView2" android:layout_ android:layout_ android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout4" android:layout_ android:layout_ android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout2" android:layout_ android:layout_ 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 的高度,以便计算自定义图像所需的宽度?

感谢您能读到这里。如果您能指出解决方案的方向,将更加感谢!

【问题讨论】:

非常感谢,我遇到了类似的问题:我想要的只是应用顶部的一张图片,使用全宽。由于一些未知的原因,imageView 几乎是图像本身的两倍,挡住了宝贵的屏幕空间。感谢添加android:adjustViewBounds="true"图片高度调整 @dave android::adjustViewBounds 默认没有设置为 true 很奇怪。很高兴您的问题现在得到了解决。 【参考方案1】:

如何将您的 ImageView 更改为使用 android:layout_height="fill_parent"

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

【讨论】:

将 layout_height 更改为 fill_parent 没有任何区别,但将 adjustViewBounds 设置为 true 就可以了!我很惊讶我已经对各种视图做了这么多工作,并且不知何故设法没有注意到那个参数!谢谢你:) 我也是。我以为它会默认为 true,但不知何故从未遇到过这个问题。 我真的问自己,为什么“false”是那个重要设置的默认值。 @MatthewWillis 你让我开心;)非常感谢。 快 2015 年了,我不知道这个 adjustViewBounds="true" 技巧(叹气)。为什么默认情况下这不是真的!我在一些设备上似乎不尊重布局重量的 ImageView 做了很多 yakshaving ......直到我找到了这个答案。拯救了我的一天!【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

这解决了我的问题.. 事实上android:scaleType="fitXY" +1 给你.. :) 感谢您的评论@MiteshShah,fitXY 最终为我工作!【参考方案4】:

是的,我的解决方案是:

android:scaleType="fitXY"

【讨论】:

以上是关于Android ImageView 大小不随源图像缩放的主要内容,如果未能解决你的问题,请参考以下文章

获取 ImageView 中图像的显示大小

Android App修改字体大小,且不随系统字体大小更改

KivyMD DatePicker 不随屏幕大小调整大小

android中ImageView放大和缩小相关问题?

java Android - Picasso的alpha / shadow变换(这允许您在源图像上绘制透明的黑色阴影)

java Android - Picasso的alpha / shadow变换(这允许您在源图像上绘制透明的黑色阴影)