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

标签 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:

有 centerInside

AVD:

编辑:

使用 layout_height="fill_parent"和 scaleType="centerInside"

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

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

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

最佳答案

这确实是一个很好的问题。

这就是它表现如此的原因(来自 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
}

它所做的是,只有当基于可绘制对象的纵横比和调整后的宽度(在我们的例子中,即父 View 的确切宽度)的新高度小于时,它才会调整 View 的高度 比调整后的高度(在我们的例子中,这只是 drawable 的原始高度加上填充。如果你想让我进一步降低这一点,请告诉我。)

我不明白的是为什么有新高度必须更小的限制。仅当我们的 heightSize 为 EXACTLY 或 AT_MOST 并且已设置为上限时才有意义。在其他情况下,它没有必要如此。

所以实际上应该调用另一个 661 到 663 而不是 661 到

heightSize = resolveAdjustedSize(newHeight, mMaxHeight, heightSpec);

确保我们只在应该限制时使用高度限制(即,我们在 heightSpec 中得到了 AT_MOST 限制,并且 heightSpec 中的高度值小于新高度。除非我们使用可变宽度,否则不会发生在这里.)

也许,我错过了什么。伙计们,无论谁正在阅读本文,如果您发现其中的任何缺陷,请发表评论,特别是如果您是 Google Android 团队的一员:)

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

UPD 我要写下名字以引起 Google 聪明的 android 人的注意(我希望他们已经设置了 Google Alerts):Romain Guy、Roman Nurik、Reto Meier ,请看一下这个讨论。

关于android - 设备屏幕尺寸对缩放的 ImageViews 有奇怪的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233259/

相关文章:

android - 使布局可滚动

java - 将一个 ImageView 放置在另一个 ImageView 的特定坐标处

android - 我如何使用带有 touchimageview 的 View 寻呼机

android - 在 TextView 中显示图像

android - 在多 Activity 应用程序中处理音乐播放

Android 文本不会居中对齐

android - 设置壁纸时出现已弃用的错误

android - 如何将 DynamicLayout 锚定到 Canvas 底部?

android - 尝试保存首选项(根据官方 android 引用)会导致错误

parsing - 如何在 Android 中解析 Ksoap2 响应