5

スレッドごとに同じ結果を達成しようとしています: Make specific area of​​ bitmap transparent on touch。私はこの回答に示されているコードに固執しています: Lumisの回答とSteDによれば、このソリューションは機能するはずです。

残念ながら、私にとっては機能しません(また、別のユーザーにとっても:タッチでビットマップの特定の領域を透明にすることは機能しません、それは黒い円を描くことです)、私はただ黒い円を取得しています。私は多くのことを試しましたが、これを解決できませんでした。2番目のスレッドからの提案に従って背景を透明にしても、違いはありません。

多くの実験の後、透明性が機能していることがわかりました。これを設定すると

android:theme="@android:style/Theme.Translucent"

私の AndroidManifest.xml では、アプリケーション、つまりデスクトップの下にあるすべてのものを見ることができます。私は何度もコードを調べましたが、明らかな間違いは見当たりません。私が考える唯一の理由は、これが Z オーダーであるということですが、ビットマップとキャンバスは z オーダーを維持しません。Z オーダーは、特定の順序で描画することによって行われます (このコードでは正しいです)。

これはAndroidコードの最適化の奇妙な例ですか、それともAndroidマニフェストファイルに何か不足していますか?

4

2 に答える 2

6

最後に、機能しているソリューションを見つけました:

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    //draw background
    canvas.drawBitmap(bgr, 0, 150, null);
    //copy the default overlay into temporary overlay and punch a hole in it                          
    c2.drawBitmap(overlayDefault, 0, 0, null); //exclude this line to show all as you draw
    c2.drawCircle(X, Y, 80, pTouch);
    //draw the overlay over the background
    //canvas.drawBitmap(overlay, 0, 0, null);

    Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/);
    new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP));
    canvas.drawBitmap(overlay, 0, 0, new_paint);
}

しかし、なぜ機能しているのかわかりません。私はこのソースコードでxfermodesを調査しました:android Xfermodes demoとこの画像によると:Xfermodes image

xfermode で、オーバーレイ ビットマップが 2 番目に描画されること (Z オーダー) と透明度が有効になることを除けば、意味がありません。ただし、Z オーダーは描画順で維持する必要があります。

誰かがこれを解決する方法をもっとよく考えているなら、あなたの知識を共有してください。

よろしく。

于 2012-05-04T04:48:45.973 に答える