だから私はここからコードを試しました:マスクを使用してImageViewを作成します。次の画像を元のマスクとして使用しています。
ただし、得られる結果は次のとおりです。
ウィンドウの背景は黒ではなく、ホロ ライトであることに注意してください (ギャラクシー ネクサスでは、完全な白ではなく、非常に淡いグレーに見えます)。2 番目の画像は、リスト ビューで項目を選択したときに得られる結果です。
代わりに、同じアルゴリズムを使用して新しいビットマップを作成し、onDraw() をオーバーライドする代わりにイメージ ビューに渡すと、正しく描画されます。
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
期待される結果が得られます:
フェードが正しく適用されていることに注意してください。これは、選択が行われるとより明白になります。
では、ウィンドウの背景が透けて見えるようにする代わりに、この黒い背景を作成する ImageView の onDraw メソッドで何が起こっているのでしょうか? 興味深いのは、元の画像自体にある程度の透明度がある場合、その透明度が尊重されることです。次に例を示します。
私は自分でそれを理解することはできません。ビットマップをソースおよびマスクとしてのみ機能するため、ビットマップを事前に作成するのではなく、onDrawで実行できるようにしたいと思います。グラデーションや単色などの他のドローアブルで実行できるようにしたいのですが、その場合、幅と高さが設定されていません。