2

簡単なペイント アプリケーションを実行しようとしていますが、onDraw を呼び出すたびに、以前にあったものが消去されます。私のオンドローでは、次のことを行っています(ポイントはxとyのintを持つクラスで、「ポイント」はリストポイントです):

        Paint paint = new Paint();
        int c = getPaintFromActivityClass();
        paint.setColor(c);
        Path path = new Path();
        boolean first = true;
        for(Point point : points){
            if(first){
                first = false;
                path.moveTo(point.x, point.y);
            }
            else{
                path.lineTo(point.x, point.y);
            }
        }
        canvas.drawPath(path, paint);

毎回「古い」パスを新しいパスに追加しようとしましたが、基本的にパスを互いに連結し、個別の(接続されていない)パスを作成しました。ただし、onDraw では、別のビューによって変更されているペイント カラーも設定しています。パスを相互に追加すると、色を変更するとすべてのパスの色が変わりました。

4

2 に答える 2

2

呼んでいsuper.onDraw(canvas)ますか?その場合は、その後すべての描画を実行します。そうしないと、スーパーコールによってビュー全体が再描画されます。

onTouchを使用している場合は、パンやズームも行っていると思います。その場合canvas.save()は、描画を行う前とcanvas.restore()後で使用します。AndroidキャンバスはHTML5キャンバスに似ており、この説明はAndroidドキュメントよりも優れています(インターネット上の他のプログラミングトピックページと同様です;))

https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Transformations

于 2012-04-17T21:06:50.973 に答える
2

もう 1 つのオプションは、パスと色の ArrayList または Vector を作成し、それぞれを保存してから、onDraw メソッドを変更することです。これらをクラスに追加します。

ArrayList<Path> paths;
ArrayList<int> colors;

onTouch では、各 ArrayList にパスと色を作成して追加し、ondraw でパスをトラバースします... ontouch メソッドで無効化を呼び出します。最初からやり直すには、ArrayList を空にします

Paint paint = new Paint();
for(int i =0 : i < Paths.size() ;i++){ 
paint.setColor(colors.get(i));
canvas.drawPath(paths.get(i), paint);
}

大量のビットマップを作成する場合は、適切なタイミングでそれらをリサイクルしてください。履歴を追跡したい場合は、この回答の概念の方が適している可能性があります。単純な「元に戻す」ボタンを実行して、最後のエントリをポップアウトするのは簡単です。色とパスを追跡する独自のクラスを作成することで、これをさらに改良することができます。その場合、カスタム クラスの ArrayList は 1 つだけになります。

于 2012-04-17T21:35:09.270 に答える