更新: 多个设备屏幕尺寸是一个红色鲱鱼 - 问题只是图像没有正确放大以填满屏幕 - 请参阅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
中明确设置图像高度,它会按预期工作,但我永远不知道图像(或屏幕)的尺寸是多少。有什么建议吗?
答案 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" />