2016-07-18 3 views
0

私はアンドロイドキャンバスを初めて使用していますが、私の問題の解決に失敗しました。 問題は次のとおりです: 私は2つのモードでキャンバスを使用していますAvoidXfermode.Mode.TARGET色)とPorterDuff.Mode.CLEAR(キャンバスの一部を消すため)。 キャンバスビットマップが保存されていません

すべてが独立して、完璧な を取り組んでいるが、私のコードで私は特定の色を消去したい選択したときに、それを消去しなければならない、と私のコードがそうするように、それらの両方を使用する場合、

しかし、消しゴムモードに切り替えるときにその特定の色を削除した後... AvoidXfermodeを使用して削除されたものがすべて戻ってきます。

私は私のonDrawメソッドがある 、ビットマップ上でこれらの事をしています:

@Override 
    protected void onDraw(Canvas canvas) { 

     canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint); 
     if (flag != 1) { 
      setDrawingCacheEnabled(true); 
      for (Path p : paths) { 

       canvas.drawPath(p, mPaint); 
       Bitmap bitmap = getDrawingCache(); 
       DrawBitmap = bitmap; 



       // 
      } 
      //canvas.setBitmap(bitmap.isMutable() ? bitmap : bitmap.copy(Bitmap.Config.ARGB_8888,true)); 

     } else if (flag == 1) { 
      if (touchx > mCanvas.getWidth() || touchy > mCanvas.getHeight() || touchx < 0 || touchy < 0) { 
       return; 
      } 
      for (Path p : paths) { 

       color = DrawBitmap.getPixel(touchx, touchy); 
       mPaint.setXfermode(new AvoidXfermode(color, 100, AvoidXfermode.Mode.TARGET)); 
       mPaint.setColor(Color.TRANSPARENT); 
       canvas.drawPaint(mPaint); 

       setDrawingCacheEnabled(true); 
       Bitmap bitmap = getDrawingCache(); 
       DrawBitmap = bitmap; 
      } 



     } 


    } 

すべてが、ちょうどこの質問のために今のところonDrawで宣言さ と私は私のモードを切り替えるコードがあるされています。

case R.id.erase: 
      mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      mPaint.setColor(Color.TRANSPARENT); 
      mPaint.setStrokeWidth(40); 
      flag = 0; 
      break; 

case R.id.DELETE: 

      flag = 1; 
      break; 

私は私キャンバスを作成していたコードは次のとおりです

DrawBitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample); 
    DrawBitmap = DrawBitmap.copy(Bitmap.Config.ARGB_8888, true); 
    mCanvas = new Canvas(DrawBitmap); 
    mPath = new Path(); 
    paths.add(mPath); 
    DrawBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

私はどこかに間違っていますが、私はどこにいても、何かアドバイスが役立つだろう、事前に感謝します。

答えて

0
Bitmap bitmap = getDrawingCache(); 
DrawBitmap = bitmap; 

ロジックが非常に複雑です。私は特に上記のコード行を意味します。 DrawBitmapビットマップでバックアップされたmCanvasがあります。次にcanvasonDraw()で、それはそれ自身のビットマップに裏打ちされています。あなたが理解する必要があるものは、DrawBitmapに描いたものであれ、それを「保存したもの」と呼んでいるものです。 canvasを介して引き出されたものは、次の呼び出し時にonDraw()に変更されます。

DrawBitmapに何かを保存する場合は、mCanvasを使用してください。ユーザーの描画の状態を保存したいときは、mCanvasに描画します。 mCanvasにすべてを描くことができ、onDraw()の最後にはcanvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);と呼ぶことができます。このようにして、ユーザーが行うすべての作業がステップごとに保存されます。

+0

私は自分のモードをAvoidXfermodeから消しゴムモードに切り替えるたびに、すべてのものが再び戻ってきていることに気づきました。 。 – Ashwani

+0

と私はmCanvasだけを使用している場合は何も描画されていません.. :( – Ashwani

+0

私は何をしたいのですか?handyclosetによって写真レイヤのようなアプリです。自動消去の背景と手動消去の機能。 – Ashwani

関連する問題