13

カスタムビューの背景画像を変更しようとしていますが、成功しています。画像は変更されますが、問題は、古い画像の痕跡がまだ表示されていることです。新しい画像を描画する前にキャンバスをクリアしようとすると、機能していないように見えます。画像を保存するためのビットマップを作成します。画像を変更するときは、新しい画像を描画する前にCanvas.drawColor()を呼び出しますが、古い画像は保持されます。drawColor(0)、drawColor(Color.BLACK)、c.drawColor(0、PorterDuff.Mode.CLEAR)を試しましたが、上記のいずれも機能しません。そういうものとして、私は私よりも経験豊富な心からのレビューのためにこれを投稿しなければなりませんでした。

実際のコードは次のとおりです。

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

4 に答える 4

31

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

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
// start your own drawing
于 2011-08-09T10:56:45.280 に答える
3

Canvasのメソッドを使用できますdrawRGB

于 2011-12-10T05:08:02.560 に答える
2

onDrawメソッド内からinvalidate()を呼び出す必要はありません。これにより、そのonDrawで行われた変更が画面上で更新されますか?

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

于 2011-01-10T19:51:00.283 に答える
0

私はこの問題に遭遇します。

「..Drawxxx(); Post();」を繰り返すことで解決します。少なくとも3回は、うまく機能します。

「ダブルバッファリング」が理由だと思いますが、「トリブルバッファリング」の場合もあります。各「バッファ」が更新されていることを確認するために、描画を繰り返す必要があります。

于 2018-08-23T00:12:51.357 に答える