2013-02-26 25 views
0

我以前在fingerpaint類的工作,我是非常舒適,但這個時候,我發現自己執行這兩個撤消的功能和刪除深陷困境添加撤消和刪除以FingerPaint.java

這是我的畫鑑於

public class MyView extends View {  
     private Bitmap mBitmap; 
     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mBitmapPaint; 

     public MyView(Context c) { 
      super(c); 
      mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);    
      mCanvas = new Canvas(mBitmap);   
      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG);    
     } 

     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      super.onSizeChanged(w, h, oldw, oldh); 
     } 
     @Override 
     protected void onDraw(Canvas canvas) { 
      /*canvas.drawColor(Color.WHITE);   
      canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);*/ 

      for (int i=0;i<paths.size();i++){ 
       canvas.drawPath(paths.get(i).path, paths.get(i).paint); 
      } 

      canvas.drawPath(mPath, mPaint); 

     } 

     private float mX, mY; 
     private static final float TOUCH_TOLERANCE = 4; 

     private void touch_start(float x, float y) 
     { 
      if (erase == true) 
      { 
       mPath.reset(); 
      } 
      undonePaths.clear(); 
      mPath.moveTo(x, y); 
      mX = x; 
      mY = y;   
     } 
     private void touch_move(float x, float y) { 
      float dx = Math.abs(x - mX); 
      float dy = Math.abs(y - mY);   
      if (check == 1 || (selectedId == ERASE_MENU_ID)) 
      { 
       if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) 
       { 
        mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
        mX = x; 
        mY = y; 
        mCanvas.drawPath(mPath, mPaint); 
       } 

      } 

      if(selectedId == ERASE_MENU_ID) 
      { 
       mCanvas.drawPath(mPath, mPaint); 
       mPath=new Path(); 
       mX = x; 
       mY = y; 
       mPath.moveTo(x, y); 
      } 

     } 

     public void onClickUndo() { 
      if (paths.size()>0) 
      { 
       paths.remove(paths.size()-1); 
       invalidate(); 
      } 
      else 
      { 

      } 
      //toast the user 
     } 
     private void touch_up() {  
      mCanvas.drawPath(mPath, mPaint);  

      MyDataHolder md=new MyDataHolder(); 
      md.paint=mPaint; 
      md.path=mPath; 

      paths.add(md); 

      mPath=new Path(); 
     } 


     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      float x = event.getX(); 
      float y = event.getY();      
      switch (event.getAction()) 
      { 
      case MotionEvent.ACTION_DOWN : 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE : 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP : 
       touch_up(); 
       invalidate(); 
       break; 
      }   
      return true; 
     } 
    } 

現在的問題是,當我改變mPaint的方式來清除

  erase=true; 
    mPaint.setXfermode(null); 
    mPaint.setStrokeWidth(25.0f); 
    //mPaint.setColor(Color.TRANSPARENT); 
    mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 

每繪製路徑變爲黑色與25寬有人sugges特德,我使用相同的油漆,所以我做了一個包裝類來存儲油漆和路徑對象,但它不工作。

回答

0

我可以幫你刪除(清除屏幕)。這是非常簡單和基本的方法。 創建一個布爾變量(比如mclears)。當您按下「清除」按鈕時將其設置爲真。 中的OnDraw(),使用

if(clears){ 
myBitmap.eraseColor(bcolor); 
//Sets your canvas (bitmap) color to your background color. i.e. clears canvas 
    clears=false; 
      } 

您可能需要改變你的Touch_up方法的位。像

 private void touch_up() {  
     mCanvas.drawPath(mPath, mPaint);  
     MyDataHolder md=new MyDataHolder(); 
     mPath.reset(); 
     md.paint=mPaint; 
     md.path=mPath; 
     paths.add(md); 
     mPath=new Path(); 
    } 

我已經在我的應用程序中實現了這一點。希望對你有效。