设备屏幕尺寸对缩放的ImageViews有奇怪的影响

时间:2012-02-10 19:00:40

标签: android android-layout android-imageview

更新: 多个设备屏幕尺寸是一个红色鲱鱼 - 问题只是图像没有正确放大以填满屏幕 - 请参阅Ivan的回答评论。

我有一个带有一个图像的布局文件:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="centerCrop" />

然后我分配了一个drawable,它很小,必须按比例放大:

setContentView(R.layout.image_story);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(s.image);

以下是在具有不同屏幕尺寸的两个AVD上渲染的方式。这些应该是相同的(底部的详细问题)。对不起大图。

scaleType = centerCrop:

with centerInside

自动真空淀积:

编辑:

使用layout_height =“fill_parent”和scaleType =“centerInside”

我的2.1 AVD具有默认值,因此屏幕较小,这与预期完全一致 - 图像按比例放大以填充宽度,视图高度被包裹到缩放高度。

在我的Droid Bionic上使用更长的屏幕,并且在具有相同屏幕尺寸的任何AVD上,这不起作用 - 图像缩放以填充宽度,但视图被包裹到原始预先缩放图像高度,因此顶部和底部都会被裁剪掉。

我不知道为什么设备屏幕宽高比会对此产生影响。我已经尝试了无数的布局参数和比例类型的组合,试图让它在Bionic上运行。一切都在小屏幕上完全按预期工作,而不是在更大的屏幕上。如果我在dp中明确设置图像高度,它会按预期工作,但我永远不知道图像(或屏幕)的尺寸是多少。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

这确实是一个非常好的问题。

这就是它的行为(来自ImageView.onMeasure(int, int) [line 661]):

// Try adjusting height to be proportional to width
if (!done && resizeHeight) {
    int newHeight = (int)((widthSize - pleft - pright)
            / desiredAspect) + ptop + pbottom;
    if (newHeight <= heightSize) { // line 661
        heightSize = newHeight;
    } // line 663
}

它的作用是仅当基于可绘制宽高比和调整宽度的新高度(在我们的情况下,是父视图的精确宽度)时调整视图的高度比调整后的高度(在我们的情况下,这个点只是可绘制的原生高度加上填充。如果你想让我进一步制动这一点,请告诉我。)

我没有得到的是为什么新高度必须更小的限制。只有当我们的heightSize是完全或AT_MOST并且已设置为上限时才有意义。在其他情况下,没有必要这样做。

所以实际上不是整个661到663,应该再次调用

heightSize = resolveAdjustedSize(newHeight, mMaxHeight, heightSpec);

确保我们只在限制时使用高度限制(即我们在heightSpec中得到AT_MOST限制,而heightSpec中的高度值小于新高度。除非我们使用可变宽度,否则不会发生这种情况。)

也许,我错过了那里的东西。伙计们,无论是谁在阅读这篇文章,如果您发现任何缺陷,请发表评论,特别是如果您是Google Google Android团队的成员:)

PS 作为一种解决方法,我建议您实现自定义ImageView并覆盖 onMeasure(int,int),以将边界设置为您的确切宽高比。如果您需要有关实际代码的帮助,请与我们联系。

UPD 我要写出一些名字来引起谷歌智能机器人的注意(我希望这些家伙有谷歌警报设置):Romain Guy,Roman Nurik,Reto Meier ,请看一下这个讨论。

答案 1 :(得分:0)

据我了解,您需要缩放图像以保持其宽高比。 scaleType="fitCenter"应该为您提供所需的行为:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter" />

如果没有用,请尝试将其添加到清单文件中:

<supports-screens
    android:resizeable="true"
    android:smallScreens="true"
    android:normalScreens="true"
    android:largeScreens="true"
    android:anyDensity="true" />