私はAndroidプログラミングの初心者ですが、これを突き止めるのに多くの時間を費やしたので、誰かが何が起こっているのか知っていることを願っています. 私のアプリにはたくさんの Thing オブジェクトがあり、それぞれにビットマップがあり、それぞれが何らかの方法でビットマップを変更します (色、サイズなどを変更します)。これはすべて、MS ペイントで作成したいくつかの「テスト」ビットマップ (.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[localhost:8611]
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2663
ActivityThread.handleLaunchActivity(ActivityThread $ActivityRecord, Intent) 行: 2679
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) 行: 125 ActivityThread$H.handleMessage(Message) 行: 2033
ActivityThread$H(Handler).dispatchMessage(Message) 行: 99 Looper .loop() 行: 123 ActivityThread.main(String[]) 行: 4627
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行: 利用不可 [ネイティブメソッド]
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 ターゲットに対して実行すると、別の場所でビットマップの処理にまだ問題があるように見えますが、RuntimeException はスローされなくなりました。したがって、これは単なるバグのように思えます。