2012-05-02 9 views
5

スレッドごとに同じ結果を達成しようとしています: Make certain area of bitmap transparent on touch 私はこの答えに提示されたコードに固執しています:Lumis answerとSteDによれば、この解決法はうまくいくはずです。ビットマップの特定の領域をタッチすると透明になります - >再度

残念ながら(他のユーザのためにも、そして:Make certain area of bitmap transparent on touch doesn't works, it's draw a black circle)私のために働いていない、私はちょうど黒丸を取得しています。 私は多くのことを試みましたが、解決できませんでした。第2のスレッドからの示唆に従って、背景を透明にすることは何の違いもありません。

は、多くの実験の後、私は私が、私は自分のアプリケーション、すなわちデスクトップの下ですべてのものを見ることができ、私のAndroidManifest.xmlでこの

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

を設定していたときに透明性が、働いていることがわかりました。 私はコードを何回も繰り返してきましたが、明白な間違いがあります。私はこれがZオーダーであると考えている理由だけですが、ビットマップとキャンバスは保守zオーダーではありません。 Z順序付けは、特定の順序で描画することによって行われます(このコードでは正しい)。

アンドロイドのマニフェストファイルに何か不足していますか?

答えて

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); 
} 

をしかし、働いている理由私は理解していません。オーバーレイビットマップが二描かれた豆(Zオーダー)と透明性が遊ぶようになったことを確認しますxfermodeその離れて、それがどんな意味をなしませXfermodes image

android Xfermodes demoとこの画像に応じて:私は、このソースコードとxfermodesを調査しました。しかし、Zオーダは描画命令によって維持されるべきです。

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

よろしくお願いいたします。

+0

ペイントnew_paint = newペイント(/ * Paint.ANTI_ALIAS_FLAG * /); new_paint.setXfermode(新しいPorterDuffXfermode(Mode.SRC_ATOP)); canvas.drawBitmap(オーバーレイ、0、0、new_paint); ===================================== = それは解決した主なものでした – ViVekH

2

あなたはonDraw()メソッドを編集することができます。

public void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     canvas.drawColor(Color.TRANSPARENT); 
     canvas.drawBitmap(bgr, 0, 0, null); 

     c2.drawCircle(X, Y, 10, pTouch); 
     Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/); 
     new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); 
     canvas.drawBitmap(overlay, 0, 0, new_paint); 
    } 

私が試したし、それが働きました! このソリューションがお役に立てば幸いです

+0

おかげで.. ..これは私を助け.. –

関連する問題