【问题标题】:Android - png resource converted to a ColorDrawable on android < 4.0Android - png 资源在 android < 4.0 上转换为 ColorDrawable
【发布时间】:2013-09-24 17:17:38
【问题描述】:

根据文档here,PNG 资源应转换为BitmapDrawable。但是我观察到一个奇怪的行为,如果我尝试执行以下操作,其中 只有黑色像素 的 png 文件会因为 ClassCastException(包裹在 InvocationTargetException)而导致崩溃在自定义视图的构造函数中:

... tempDrawable = typedArr.getDrawable(R.styleable.CustomView_src); // 源指向一个 png 文件 Log.i("TestPNGToResource", "规范类名" + tempDrawable.getClass().getCanonicalName()); tempBitmap = ((BitmapDrawable) tempDrawable).getBitmap(); ...

我在 android 2.2 和 2.3 上看到以下登录

09-24 13:21:37.575: I/TestPNGToResource(532): 规范类名 android.graphics.drawable.ColorDrawable

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

【问题讨论】:

  • 如果 png 有一些彩色像素,它还会发生吗?不确定 aapt 的 png 优化是否真的可以将纯色图像转换为 ColorDrawable 或者在解析您的自定义属性时是否出现错误
  • 对于具有彩色像素的图像不会发生这种情况。如果自定义属性有任何错误,它应该在任何设备上都失败。它在运行 4.3 的 Nexus 4 上按预期工作。

标签: android android-drawable android-inflate bitmapdrawable colordrawable


【解决方案1】:

这是 aapt 执行的优化。它能够识别由单一颜色组成的图像,并将它们变成单一颜色而不是位图。这更节省空间,缩短加载时间等。

【讨论】:

  • 作为记录,有没有办法覆盖这种行为,或者是否有必要在代码中检查它?
  • 根据此处的文档:developer.android.com/guide/topics/resources/…,我将可绘制对象转换为 BitmapDrawable,这会导致崩溃,因为在这种情况下它会被转换为 ColorDrawable。
  • 文档不正确,应该更新。 @Geobits:你必须在代码中检查它。
  • 只是为了澄清,BitmapDrawable 或 ColorDrawable 是唯一可能的情况,对吧?
  • 要清楚,这个函数返回一个Drawable,仅此而已。您应该对它返回的内容做出假设。如果您想要位图,请使用:developer.android.com/reference/android/graphics/…
【解决方案2】:

我认为这不会发生在 9-patch 图像中,对吧?还有,在使用图片文件的时候,解压apk文件还会显示里面的图片文件吗?

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

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

那么,如果它是任何颜色类型,您可以使用该颜色创建自己的可绘制对象。问题是如何获得大小,如果这是你得到的。

但是,如果在您展示的特殊情况下,您获得了一个引用类型,您可以通过使用BitmapFactory.decodeResource() 创建位图来强制它为 BitmapDrawable。

【讨论】:

  • 通常我不会这样做,但我的问题得到的关注很少,我不知道该怎么做,所以你能看看这个question好吗?我真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多