2011-11-08 8 views
1

私はQtの世界から来て、私はAndroidにアプリケーションを移植しています。私はちょっと混乱しています。私は数日間頭を叩いています。なぜそれがうまくいかないのかわからないほど些細なことになるはずです。ビットマップ(NDK +アルファバイト)を使用しているAndroid:何か不足していますか?

背景:私はトラフNDKとJNIを使​​用するC++エンジンを持っています。このエンジンはいくつかのビットマップを作成し、Java側に渡します。Java側では、それらをビューに表示し、ユーザーがそれらとやりとりできるようにする必要があります(ドラッグなど)。

エンジンは正常に動作します。なぜなら私はQtの下でそれを完全に使用しているからです。これはワークフローです:

1 - Javaは、カスタム・データ・ファイルから大きなビットマップをロードします(C++エンジンは、それがARGB形式であることを期待、それは、圧縮JPGデータです)

Bitmap.Config fmt = Bitmap.Config.ARGB_8888; 
Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0, size).copy(fmt , false); 

2 - 初期化ビットマップを渡すC++エンジン。 C++エンジンは、小さなタイルでビットマップを "分割"します。タイルの場合、それはかなり複雑なアルファマスクを作成し、それをビットマップの最初のバイト( "a"バイト)に格納します。このアルファマスクは2つの値しか使用しません:0xFFは不透明、0x00は透明です。

init_C_engine(this.fullImage); 

、3-初期化する前に、私はタイルがされるサイズを知らないので、Java側はその後、私は2つのステップで行い、すべてのタイルのビットマップを割り当てます。 C++エンジン内部、全てのタイルがビットマップが満たされている、

Bitmap.Config fmt = Bitmap.Config.ARGB_8888; 
for (int t = 0; t < this.puzzle_size; t++){ 
    tile_data[ t ] = Bitmap.createBitmap( tile_width[t], tile_height[t], fmt); 

、4-最終ステップ:

for (int n = 0; n < nBitmaps; n++) 
{ 
     jobject bitmap = env->GetObjectArrayElement(bitmaps, n); 
     AndroidBitmap_getInfo(env, bitmap, &info); 
     AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels)); 
     game->getTileBitmap(n, (unsigned char*)pixels); 
     AndroidBitmap_unlockPixels(env, bitmap); 
     env->SetObjectArrayElement(bitmaps, n, bitmap); 
    } 
} 

さて、私のカスタムビューで:エンジンはtile_widthとtile_height配列を移入します

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.BLACK); 
    for (int tile = 0; tile < board.nTiles; tile++){ 
      canvas.drawBitmap(tile_data[tile], 
           tile_x[tile], 
           tile_y[tile], paint); 
     } 
} 

私の見解では、透明領域を持つタイルが表示されます。黒い背景の上に、アルファバイトのような全部のタイルがすべて不透明に設定されているのが見えますが、タイルをもう一方のレイヤーの上に移動すると、「透明な」領域が組み合わされますいくつかの奇妙な方法、色のような "xor"エドまたは何らかの形で倍増!私は他の1つのタイルを移動すると、アルファバイトが透明に設定されている領域を見ることができますが、色は透明になる代わりにマングルされます!

は基本的に私は0にアルファセットを持つピクセルは透明として描かれていることを期待して...私は、インターネット上に見えたが、私は私を助けるために便利な何かを見つけることができませんでした....

誰かがアイデアを持っていますか?何かが感謝されます!ありがとう。

+0

Hmm ..あなたが期待しているように、望ましくないフィルタリングがあるかもしれません。 'Paint.setColorFilter'と' PorterDuffColorFilter'を見てください。そこでは、アルファの扱い方を選択することができます。 – harism

+0

残念なことに、Androidのドキュメントは非常に薄いため、setColorFilterの動作や使用方法を理解できません。あなたは例や文書を知っていますか? – WillyGardiol

+0

残念ながら私は適切な答えを与えることはできませんが、[PorterDuff.Mode](http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html)のドキュメントでは、最終的な色の値を計算するための方程式が示されています。そして私はSRC_ATOPがあなたが探しているものだと推測しています。 – harism

答えて

0

の内側にあるtileの代わりにtのインデックスを使用しないでください。このように:

canvas.drawBitmap(tile_data[t], tile_x[t], tile_y[t], paint); 
+0

はい、申し訳ありませんが、コピー&ペーストエラーです。一定。 – WillyGardiol

関連する問題