2016-05-22 13 views
7

私はこの問題を探り、さまざまな解決策を提案しました。
しかし、私のために働いたものはありません。キャンバス消しゴムは黒い線を描いています

私はアプリに描画キャンバスを持っています。
キャンバスの背景は、カスタムビュー(drawView)を使用するアクティビティのpng Imageに設定されています。 DrawingViewクラスの

Bundle extras = intent.getExtras(); 
    if (extras != null) { 
     if (extras.containsKey("background")) { 

      //set the background to the resource in the extras 
      int imageResource = intent.getIntExtra("background",-1); 
      Drawable image = getResources().getDrawable(imageResource); 
      drawView.setBackground(image); 
     } 
    } 

(それは消しゴムした場合の塗料を使用、パスと)(drawviewインスタンスである)、Iは3つの特性を有するPathPaintsのコレクションに描画パスを格納します。

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>(); 

それからOnDrawにこれらのパスを介してループにしようと彼らが(みとめ色)で描画した塗料とするたびに再描画します。

protected void onDraw(Canvas canvas) { 

    //if the drawing is new - dont draw any paths 
    if (isNew != true) { 

     //go through every previous path and draw them 
     for (PathPaint p : paths) { 

      if (!p.isErase) 
      { 
       canvas.drawPath(p.myPath, p.myPaint); 
      } 
      else 
      { 
       //Paint eraserPaint = setDefaultPaint(); 
       //eraserPaint.setAlpha(0xFF); 
       //eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
       //eraserPaint.setColor(Color.TRANSPARENT); 
       //canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
       canvas.drawPath(p.myPath, p.myPaint); 
      } 
      canvas.drawBitmap(canvasBitmap, 0, 0, null); 

     } 
    } 

私は多くの提案されたオプションをオンラインで試したが、役に立たない。

私は様々なコメントアウトされたすべてのプロパティを設定するためにdrawpathのペイントを設定しようとしました。

Iがビットマップに描画した後、キャンバスにそのビットマップをロードする(canvas.drawBitmap(canvasBitmap、0、0、NULL))

を試みた私は

このクラスのコンストラクタでハードウェアアクセラレーションをオフになっています
setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

ただし、行が描画されていないか、コレクションがパスを再描画しているときに消しゴムが黒い線を描画します。面白いです何

enter image description here

私はループ面なしでビットマップを使用して消去を行う場合ということです - 予想通り消しゴムで動作します。

//If we are making a new drawing we don't want to go through all the paths 
    if (isNew != true && erase ==false) { 

     //go through every previous path and draw them 


     for (PathPaint p : paths) { 

      if (!p.isErase) 
      { 
       canvas.drawPath(p.myPath, p.myPaint); 
      } 
      //this section now takes place in the elseIF 
      else 
      { 
       Paint eraserPaint = setDefaultPaint(); 
       eraserPaint.setAlpha(0xFF); 
       eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
       eraserPaint.setColor(Color.TRANSPARENT); 


       canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
       canvas.drawPath(p.myPath, p.myPaint); 
      } 
     } 
    } 
    else if (isNew != true && erase ==true) 
    { 
     //This works correctly for Erasing but I dont have the ability to Undo/Redo with this approach! 
     canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
     canvas.drawPath(drawPath, drawPaint); 

    } 

これは、しかし、私は(収集のためのポイントを)消去やり直し/元に戻すことができるようにしたいので、問題である

誰も私を助けてくださいことはできますか?

+0

drawView.setBackground(image);この行に** drawView **とは何ですか? –

答えて

2

最初に背景画像を配置し、その後背景を置き換えるパスを描画する場合は、1つのビュー(レイヤー)のみを使用するようです。その場合、消去すると、パスと背景を含むビュー/レイヤーだけが削除されます。 2つのレイヤー(Framelayout内の2つのビュー)を使用する場合は、バックグラウンドを読み込むバックグラウンドと、すべてのパスを配置するフロントの1つを使用し、最上位レイヤーを消去するとパスとバックグラウンドが削除されます入ってくる。

レイヤリングを行う方法はさまざまです。例として、これでframeLayoutは、現在の背景を保持しているビューを置き換えると描かれたパスが(コードでXXXViewと呼ぶ。)

<FrameLayout 
    android:layout_width= ...copy from the existing XXXView ... 
    android:layout_height= ...copy from the existing XXXView ... > 

    <ImageView 
     android:id = "@+id/background" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     ... 
     ... the background is loaded here /> 


    <XXXView (this the existing view where the paths are drawn onto) 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     ... 
     ... no background here /> 

</FrameLayout> 
+0

レイヤリングの仕組みをいくつかのコード例で教えていただけますか? –

+0

例のおかげで、これは完全に動作します!よくやった!!!! –

0

キャンバスビットマップをチェックし、それがConfig.ARGB8888ありますか?

また、この答えAndroid canvas: draw transparent circle on image

をチェックし、私は右、あなたのdrawViewはImageViewのあるされていないと思いますか?

関連する問題