アルファが必要なオブジェクトのpngファイルを使用してAndroidアプリを起動しましたが、必要なスペースが多すぎることにすぐに気付きました。そこで、アルファ付きのpngを取り、白黒アルファマスクのpngファイルとjpegを作成するプログラムを作成しました。これにより、スペースを大幅に節約できますが、速度はそれほど速くありません。
以下は、jpg画像(コード内のorigImgId)とpngマスク(コード内のalphaImgId)を組み合わせたAndroidアプリのコードです。
動作しますが、高速ではありません。私はすでに結果をキャッシュしていて、ゲームが始まる前にメニュー画面にこれらの画像をロードするコードに取り組んでいますが、これを高速化する方法があればいいのですが。
誰か提案はありますか?わかりやすくするために、コードを少し変更したことに注意してください。ゲームでは、これは実際にはオンデマンドで画像をロードし、結果をキャッシュするスプライトです。ここに、画像をロードしてアルファを適用するためのコードが表示されます。
public class BitmapDrawableAlpha
{
public BitmapDrawableAlpha(int origImgId, int alphaImgId) {
this.origImgId = origImgId;
this.alphaImgId = alphaImgId;
}
protected BitmapDrawable loadDrawable(Activity a) {
Drawable d = a.getResources().getDrawable(origImgId);
Drawable da = a.getResources().getDrawable(alphaImgId);
Bitmap b = Bitmap.createBitmap(d.getIntrinsicWidth(),d.getIntrinsicHeight(),Bitmap.Config.ARGB_8888);
{
Canvas c = new Canvas(b);
d.setBounds(0,0,d.getIntrinsicWidth()-1,d.getIntrinsicHeight()-1);
d.draw(c);
}
Bitmap ba = Bitmap.createBitmap(d.getIntrinsicWidth(),d.getIntrinsicHeight(),Bitmap.Config.ARGB_8888);
{
Canvas c = new Canvas(ba);
da.setBounds(0,0,d.getIntrinsicWidth()-1,d.getIntrinsicHeight()-1);
da.draw(c);
}
applyAlpha(b,ba);
return new BitmapDrawable(b);
}
/** Apply alpha to the specified bitmap b. */
public static void applyAlpha(Bitmap b, Bitmap bAlpha) {
int w = b.getWidth();
int h = b.getHeight();
for(int y=0; y < h; ++y) {
for(int x=0; x < w; ++x) {
int pixel = b.getPixel(x,y);
int finalPixel = Color.argb(Color.alpha(bAlpha.getPixel(x,y)), Color.red(pixel), Color.green(pixel), Color.blue(pixel));
b.setPixel(x,y,finalPixel);
}
}
}
private int origImgId;
private int alphaImgId;
}