Android View.onDraw() は常にクリーンな Canvas を持ちます
-
19-09-2019 - |
質問
アニメーションを描こうとしています。そのために、View を拡張し、onDraw() メソッドをオーバーライドしました。私が期待しているのは、onDraw() が呼び出されるたびにキャンバスがそのままの状態になり、それをクリアするか、その一部を描画するだけかを選択できるということです (これは、SurfaceView を使用したときの動作です) )しかし、キャンバスが戻ってくるたびに、すでにクリアされています。クリアできない方法はないでしょうか?それとも、前の状態をビットマップに保存して、そのビットマップを描画して、その上に描画できるようにするのでしょうか?
解決
私は道かどうかがあるかどうかはわかりません。しかし、私のカスタムビューのために、私はどちらかのたびにonDraw()が呼び出されたすべてのものを再描画、またはビットマップに描画して、(あなたがあなたの質問で提案のように)キャンバスにビットマップを描画します。
ここで私はそれを行う方法
class A extends View {
private Canvas canvas;
private Bitmap bitmap;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (bitmap != null) {
bitmap .recycle();
}
canvas= new Canvas();
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
}
public void destroy() {
if (bitmap != null) {
bitmap.recycle();
}
}
public void onDraw(Canvas c) {
//draw onto the canvas if needed (maybe only the parts of animation that changed)
canvas.drawRect(0,0,10,10,paint);
//draw the bitmap to the real canvas c
c.drawBitmap(bitmap,
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
}
}
他のヒント
見てみるといいよ ここ Basic View と surfaceView の違いを確認します。surfaceView には描画専用のレイヤーがあり、以前に描画した内容を追跡していると思います。本当に基本的なビューでそれを実行したい場合は、次の例のように、描画した各項目を配列に入れてみることができます。 マップビューの項目別オーバーレイ。ほぼ同じように動作するはずです
あなたの期待は/現実wのジブはありません:)キャンバスは、あなたがそれを代わりに空白を残したが、道ではありません。あなたは)その後、OnDraw(でのArrayListものの反復、描画するオブジェクトのArrayListを作成します(canvas.drawCircleを()、canvas.drawBitmap()など)があります。私は、グラフィックスプログラミングに新しいですが、私は小さな規模で、これを使用しています。たぶんもっと良い方法があります。