【问题标题】:BitmapDrawable with unexpected size in Android 2.0.1 WVGA854Android 2.0.1 WVGA854 中具有意外大小的 BitmapDrawable
【发布时间】:2012-05-07 00:59:38
【问题描述】:

我想在具有 WVGA854 皮肤和 240 lcd 密度(摩托罗拉 Droid)的 Android 2.0.1 中显示存储在 SD 卡中的 480x320 JPEG 文件。

但是,当我通过 Drawable.createFromPath() 创建 BitmapDrawable 时,生成的 BitmapDrawable 具有以下值:

mBitmapWidth = 320

mBitmapHeight = 213

mTargetDensity = 160

清单包括以下配置:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4" />
<supports-screens 
    android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
 anyDensity="true"
/>

显然,Android 正在调整位图的大小。这种行为的原因可能是什么?如何避免?

提前谢谢你。

【问题讨论】:

  • 谷歌搜索后,我发现在更高版本的 Android 中,BitmapFactory 根据屏幕密度缩放位图。 Drawable.createFromPath() 是一种在其实现中使用 BitmapFactory 的便捷方法。 BitmapFactory 似乎有一个选项可以关闭此缩放(inScaled = false),但其 API 级别为 4。解决方案可能需要反射才能在较低的 API 级别中工作。如果这会导致解决方案,将进行更多实验并发布答案。

标签: android drawable


【解决方案1】:

Drawable.createFromPath() 是一种在其实现中使用 BitmapFactory 的便捷方法。似乎从 API 级别 4 开始,Android 会自动重新缩放所有位图可绘制对象和其他资源。

要获得位图的原始大小,需要将可绘制对象转换为可绘制位图并使用 BitmapDrawable.geBitmap().getWidth() 和 BitmapDrawable.geBitmap().getWidth()。

另一种方法是直接使用 BitmapFactory 并使用 BitmapFactory.Options.inScaled 关闭重新缩放。此属性仅从 API 级别 4 开始可用,因此如果您想针对 API 级别 3 设备,您可能需要使用反射来检查其是否存在。

我仍然不明白为什么需要对 SD 卡图像进行这种重新缩放,以及这对程序员有何好处。是的,160 密度的 320x213 区域(大约)变成 240 密度的 480x320 区域,但是如果 Drawable.createFromPath() 将 240 密度的 480x320 可绘制对象返回给以 240 密度运行的应用程序,这不是更有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2014-04-06
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多