根据文档here,应将png资源转换为BitmapDrawable
。但是我正在观察一个奇怪的行为,其中png文件中只有黑色像素导致崩溃,因为ClassCastException
(包裹在InvocationTargetException
中)如果我尝试在自定义视图的构造函数中执行以下操作:
... 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?
答案 0 :(得分:3)
这是aapt执行的优化。它能够识别由单一颜色构成的图像,并将它们转换为单色而不是位图。这样更节省空间,缩短了加载时间等。
答案 1 :(得分:0)
我认为对于9补丁图像不会发生这种情况,对吧?另外,在使用图像文件时,会解压缩apk文件还在其中显示图像文件吗?
无论如何,我不确定这是否有帮助,但您是否尝试检查此值:
TypedValue value = a.peekValue(R.styleable.CustomView_src);
然后,如果它是任何颜色类型,您可以使用此颜色创建自己的drawable。问题是如何获得大小,如果这是你得到的。
但是,如果在您显示的特殊情况下,您获得了引用类型,您可以通过使用BitmapFactory.decodeResource()创建位图来强制它为BitmapDrawable。