3

根据此处的文档,应该将 png 资源转换为BitmapDrawable. 但是,我观察到一个奇怪的行为,其中如果我尝试在自定义视图的构造函数中执行以下操作,其中只有黑色像素ClassCastException的 png 文件会因为(包裹在)而导致崩溃: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?

4

2 回答 2

3

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

于 2013-09-30T17:29:31.070 回答
0

我认为这不会发生在 9-patch 图像中,对吧?另外,当使用图像文件时,提取apk文件是否仍会显示其中的图像文件?

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

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

然后,如果它是任何颜色类型,您可以使用此颜色创建自己的可绘制对象。问题是如何获得尺寸,如果那是你得到的。

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

于 2013-09-27T23:06:13.140 回答