2012-04-17 6 views
1

私は単純なペイントアプリケーションをやろうとしていますが、onDrawを呼び出すたびに以前にあったものが消去されます。onDraw()を呼び出すたびにAndroidキャンバスが消去されないようにするにはどうすればよいですか?

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

私は新しいに「古い」パスを追加してみました:私の上の引き分けで、私は、次の(ポイントがxとyのint型、および「ポイント」を持つクラスですされたリストのポイントを)やっています各パスを本質的に互いに連結し、別々の(接続されていない)パスを作成しました。しかし、onDrawでは、別のビューで変更されているペイントの色も設定しています。お互いにパスを追加したとき、色を変更するとすべてのパスの色が変更されました。

+1

パスをビットマップに描画してからこのビットマップを描画します – Selvin

+0

@セルヴィン私は正確に考えていましたが、どのようにパスをビットマップに描画しますか? – mergesort

+0

クイック検索は私にこれを与えましたhttp://stackoverflow.com/questions/4013725/converting-a-canvas-into-bitmap-image-in-android – Selvin

答えて

3

別のオプションは、ArrayListのを作成することである);(単にインターネット上の他のプログラミングトピックページ程度であるとして)Androidのキャンバスは、HTML5のキャンバスに似ており、この記述は、Androidのドキュメントよりも優れていますまたはVectorのパスと色を保存し、それぞれを保存してから、onDrawメソッドを変更します。クラスにこれらを追加します。onTouchで

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

あなたが作成し、追加する各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つしか持たないようにすることで、これをさらに洗練させることができます。

2

super.onDraw(canvas)に電話していますか?そうであれば、それ以降はすべての描画を行います。そうしないと、スーパーコールはビュー全体を再描画します。

オンタッチを使用している場合は、パンやズームを行っているようです。その場合は、図面を作成する前にcanvas.save()を、後でcanvas.restore()を使用してください。

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

+0

パンやズームがありません。また、私はsuper.onDraw(canvas)を呼び出していません。私はまだそれを働かせるように見えない。私はビットマップをどこから設定するのか、どこから描画するのかはわかりません。 – mergesort

+1

OK、最初のものが最初です。あなたはそれを達成しますが、すべてをonDrawに描画する必要があります。それは相加的なものではないので、あなたが言うように、物を連結しなければならないか、前回の抽選を保存しなければならない。このための1つのパターンは、最後のフレームを描画することです(ImageView.getBackgroundDrawable()など)。その上に新しいものを描画し、キャンバスにビットマップを描画します。http://www.tutorialforandroid.com/2009 /06/drawing-with-canvas-in-android.html – Simon

+0

コメントをお寄せいただきありがとうございますonDrawのすべてを再描画する必要があることを理解することがより理にかなっています。 – mergesort

関連する問題