Android - png资源在Android 4.0以下被转换为ColorDrawable。

3
根据这里的文档,png资源应该被转换为BitmapDrawable。然而,我观察到一个奇怪的行为,即一个只有黑色像素的png文件会导致崩溃,因为如果我在自定义视图的构造函数中尝试以下操作:

  ...
  tempDrawable = typedArr.getDrawable(R.styleable.CustomView_src); // Source points to a png file
  Log.i("TestPNGToResource", "Canonical Class Name " + tempDrawable.getClass().getCanonicalName());
  tempBitmap = ((BitmapDrawable) tempDrawable).getBitmap();
  ...

在android 2.2和2.3上记录如下

09-24 13:21:37.575: I/TestPNGToResource(532): Canonical Class Name android.graphics.drawable.ColorDrawable

为什么资源没有被转换为BitmapDrawable?


如果PNG图像有一些彩色像素,是否仍然会发生这种情况?不确定 aapt 的PNG优化是否能够将纯色图像转换为ColorDrawable 或者这是否是在解析自定义属性时出现的错误。 - zapl
对于有彩色像素的图像,这种情况不会发生。如果自定义属性存在任何错误,它应该在任何设备上都失败了。在运行4.3的Nexus 4上按预期工作。 - 500865
2个回答

3
这是aapt执行的一种优化。它能够识别由单个颜色组成的图像,并将它们转换为单个颜色,而不是位图。这样更节省空间,提高加载速度等。

2
记录一下,有没有办法覆盖这种行为,还是必须在代码中检查它? - Geobits
根据这里的文档:http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap,我将drawable转换为BitmapDrawable,结果导致崩溃,因为在这种情况下它被转换为ColorDrawable。 - 500865
1
文档不正确,需要更新。@Geobits:你必须在代码中检查它。 - Romain Guy
仅供澄清,BitmapDrawable或ColorDrawable是唯一可能的情况,对吗? - 500865
请注意,此函数仅返回一个Drawable对象,不应该对其返回值做出其他假设。如果您需要位图,请使用以下方法:http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeResource(android.content.res.Resources,%20int) - hackbod
通常我不会这样做,但我的问题得到的浏览量很少,而且我不知道该怎么做,所以你能否看一下这个问题?我真的非常感激。 - Dan

0

我认为九宫格图片不会出现这种情况,对吧?此外,当使用图像文件时,提取apk文件是否仍会在其中显示图像文件?

无论如何,我不确定这是否有帮助,但您是否尝试检查此值:

TypedValue value = a.peekValue(R.styleable.CustomView_src);

那么,如果它是任何一种颜色类型,你可以使用该颜色创建自己的可绘制对象。问题在于如何获取其大小。

但是,如果在你所展示的特殊情况中,你获得了一个引用类型,你可能可以通过使用BitmapFactory.decodeResource()创建位图来强制将其转换为BitmapDrawable。


通常我不会这样做,但我的问题得到的浏览量非常少,而且我不知道该怎么做,所以你能否看一下这个问题?我真的很感激。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接