我是Android编程的初学者,但我花了很多时间把它固定下来,所以希望有人知道发生了什么。我的应用程序有一堆Thing对象,每个对象都有一个位图,每个都以某种方式更改位图(更改颜色,大小等)。这一切都很好用我在MS Paint中制作的一些“测试”位图(保存为.png文件)。然而,当我用GIMP制作的更好的图片替换它们时,应用程序开始崩溃。
最终我发现如果在GIMP中选中“保存背景颜色”保存.png图像,应用程序才会崩溃。我需要这个,因为其中一些图片需要部分透明,以便它们可以叠加。然而:疯狂的是,当我尝试覆盖图像或创建图像时它没有崩溃,当我将ColorMatrixColorFilter应用于Paint对象时它会崩溃。
我不明白这是怎么回事。实际上将Paint对象应用于任何东西都远远不够,那么为什么一个图像文件可以工作,而另一个图像文件不工作?崩溃是ActivityThread.performLauncActivity中的RuntimeException,我无法找到更多关于它的信息。
这里有一些伪代码正是我在做什么以及它在哪里崩溃。
问题: 1)为什么会崩溃? 2)如果我想加载透明图像并应用彩色滤镜,将它们叠加在一起以创建新的位图等,我应该做些什么呢?只要我的所有图像都没有背景,所有这些都可以正常工作。
public class ThingHolder {
Thing[] things;
public ThingHolder() {
things = new Thing[3];
things[0] = new Thing(); // The first one works fine
things[1] = new Thing(); // The second fails, see below
...
// Note: It never gets far enough to draw the bitmap
// to a Canvas, that occurs much later
...
canvas.drawBitmap(things[0].bmp, null, rect, things[0].paint);
canvas.drawBitmap(things[1].bmp, null, rect, things[1].paint);
}
}
public class Thing {
Bitmap bmp;
Paint paint;
public Thing() {
bmp = getBmp(1); // this always returns resource file circle.png
paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(redMatrix()));
// RuntimeException occurs here if circle.png has a background color
// But it works fine if circle.png was saved in MS Paint, or in
// Gimp without the background color option checked
}
private float[] redMatrix() {
float[] matrix = {
1, 0, 0, 0, 0, //red
0, 0, 0, 0, 0, //green
0, 0, 0, 0, 0, //blue
0, 0, 0, 1, 0 //alpha
};
return matrix;
}
}
编辑1:这是跟踪,如果它有用:
DalvikVM [本地主机:8611]
线程[< 1> main](Suspended(例外RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread $ ActivityRecord,Intent)行:2663
ActivityThread.handleLaunchActivity(ActivityThread $ ActivityRecord,Intent)行:2679
ActivityThread.access $ 2300(ActivityThread,ActivityThread $ ActivityRecord,Intent)行:125
ActivityThread $ H.handleMessage(消息)行:2033
ActivityThread $ H(Handler).dispatchMessage(Message)行:99
Looper.loop()行:123
ActivityThread.main(String [])行:4627
Method.invokeNative(Object,Object [],Class,Class [],Class,int,boolean)line:not available [native method]
Method.invoke(Object,Object ...)行:521
ZygoteInit $ MethodAndArgsCaller.run()行:868
ZygoteInit.main(String [])行:626
NativeStart.main(String [])行:不可用[本机方法]
编辑2:这是使用2.2目标(特别是在VirtualBox中运行的android-x86-2.2-eeepc)发生的。当针对3.2目标运行时,看起来在其他地方处理Bitmap仍然存在一些问题,但它不再抛出RuntimeException。所以看起来这可能只是一个错误。