2011-01-10 10 views
11

私は、カスタムビューの背景イメージをある程度成功させようとしています。画像は変わりますが、私はまだ古い画像の跡が見えるという問題があります。新しい画像を描画する前にキャンバスを消去しようとすると、動作しないように見えます。私は画像を格納するビットマップを作成します。イメージを変更するとき、新しいイメージを描画する前にCanvas.drawColor()を呼び出しますが、古いイメージはそのまま残ります。私はdrawColor(0)、drawColor(Color.BLACK)、c.drawColor(0、PorterDuff.Mode.CLEAR)を試しています。そういうわけで、私は私よりも経験豊かな人たちからのレビューのためにこれを投稿しなければなりませんでした。Canvas.drawColor()でキャンバスをクリアする

private int bgnd; 
private boolean switching; 

public void setBgnd(int incoming){ 
    switching = true; 
    switch (incoming){ 

    case R.drawable.image1: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    case R.drawable.image2: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    } 
} 



protected void onDraw(Canvas c){ 
    if(switching == true){ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawColor(0, PorterDuff.Mode.CLEAR); 
     c.drawBitmap(b, 0, 0, null); 
     switching = false; 

    }else{ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawBitmap(b, 0, 0, null); 
    } 
} 

答えて

30

あなたと同じように、私は多層/表面ビューのアプリでトップレイヤー/サーフェイスビューをクリアする方法に苦労しました。 2日の検索とコーディングの後、私は自分のやり方を見つけました。これは描画前にキャンバスをクリアした方法です。複数のレイヤー/サーフェイスビューを持つときに使用できます。背景レイヤーは黒で覆われません。つまり、トリックです。

Paint paint = new Paint(); 
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 
canvas.drawPaint(paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); 
// start your own drawing 
+0

私はこの2つを取るのに2日以上かかったと思います。 Thx strangeInAstrangerLand + longdooooo –

2

また、あなたのonDrawメソッド内から無効化()を呼び出す必要はありませんのでonDrawで行われた変更は、画面上で更新されるように、次のように

実際のコードはありますか?

あなたのスイッチのinvalidate()は、setBgndを呼び出した後にonDrawを呼び出しますが、Canvasを変更した後に再描画することは何もありません。

+1

私は、invalidate()を呼び出すとビューがonDraw()を呼び出し、そのセルを描画するように指示するという印象を受けています。その呼び出しをメソッドに入れると、その例は次の例のように永久にループします。http://www.anddev.org/basic_and_simple_2d_drawing_-_animation-t3085.html – Prmths

+0

ああ、あなたは正しいhttp://developer.android.com/guide/topics/graphics/index.htmlを参照してください。申し訳ありませんが、私の理解は正しくありませんでした。 – C0deAttack

+0

私は初めにそれを考えました。私の質問は、invalidate()がビューに自身を再描画するよう指示した場合、アニメーションの後半に移動するまで、このビューが完全に再描画されないのはなぜですか?オブジェクトの下半分は右に見えますが、もう半分はまだ古いサーフェスです。 – Prmths

2

キャンバスのメソッドdrawRGBを使用できます。

+0

drawRGB()はアルファチャンネルをクリアしないため、ビットマップは不透明になります。したがって、ビットマップが唯一のレイヤーまたは背景レイヤーである場合にのみ使用できます。また、drawARGB()メソッドもあり、アルファチャンネルも同様に扱うことができます。しかし、それが動作する場合は試していない。 –

+1

drawRGBは単に 'drawColor(Color.rgb(r、g、b))'を使っていることに注意してください。 – TameHog

関連する問題