私はここからコードを試しました:Creating an ImageView with a mask。 Iオリジナルマスクとして、以下の画像を使用しています:Android 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でそれを行うことができます。私はグラデーションやソリッドカラーのような他のdrawableでそれをやりたいと思っていますが、幅と高さは設定されていません。
をここで更新があります。 http://stackoverflow.com/questions/3467334/erase-bitmap-parts-using-porterduff-modeを読んだあと、ビットマップ設定をARGB_8888の代わりにRGB_565に設定すると、同じ動作を再現できます。また、onDrawメソッドで渡されるキャンバスまで問題を絞り込むこともできます。 onDrawキャンバスを使用すると、黒い境界線が表示されます。onDrawに渡されたキャンバスにはビットマップが関連付けられていないため、ネイティブに透明性をサポートしていない可能性があります。私が知ったもう一つのことは、リストビューがスクロールしている間に黒い枠線が消えることです。 – AngraX
これを読んだ後、http://stackoverflow.com/questions/5231260/android-shader-behave-different-in-ondrawcanvas-and-new-canvasbitmapバグは実際には私がウィンドウキャンバスのピクセルを透明にしているようですonDraw()に渡されたキャンバスに適用すれば窓の後ろには黒い背景があります。私は別のDSTモードが見つからない限り、一時的なビットマップを使用してレンダリングするしかありません。 – AngraX
私は画像と1つの画像ビューと2番目のwih黒マスクを持っているのと同様の機能を実装しようとしていますが、触ってみればサークルの裏側の画像ビューを表示する必要があります。 – ViVekH