2014-02-05 44 views
0

我的工作在画布上的应用和撤消&恢复功能工作正常,现在我想重新使用复位button.I使用一些参考试过的画布,但无法找出这妥善解决,这是我的代码如何清除画布android中的所有内容?

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 

    private ArrayList<Path> undonePaths = new ArrayList<Path>(); 
    private ArrayList<Path> paths = new ArrayList<Path>(); 
    FrameLayout frmLayout; 
    Canvas canvas; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     frmLayout=(FrameLayout)findViewById(R.id.frameLayout);  
     final DrawingPanel dp = new DrawingPanel(this); 
     frmLayout.addView(dp); 

       ((Button) findViewById(R.id.Clear)) 
     .setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Path path = new Path(); 
      Paint clearPaint = new Paint(); 
      clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      canvas.drawRect(0, 0, 0, 0, clearPaint); 

      } 
     }); 

     ((Button) findViewById(R.id.Undo)) 
       .setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         if (paths.size() > 0) { 
          undonePaths.add(paths 
            .remove(paths.size() -1)); 
          dp.invalidate(); 
         } 
        } 
       }); 


     ((Button) findViewById(R.id.Redo)) 
     .setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if (undonePaths.size()>0) { 
         paths.add(undonePaths.remove(undonePaths.size()-1)); 
         dp.invalidate(); 
        } 
      } 
     }); 
    } 

    public class DrawingPanel extends View implements OnTouchListener { 

     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mPaint, circlePaint, outercirclePaint; 

     // private ArrayList<Path> undonePaths = new ArrayList<Path>(); 
     private float xleft, xright, xtop, xbottom; 

     public DrawingPanel(Context context) { 
      super(context); 
      setFocusable(true); 
      setFocusableInTouchMode(true); 
      this.setOnTouchListener(this); 
      circlePaint = new Paint(); 
      mPaint = new Paint(); 
      outercirclePaint = new Paint(); 
      outercirclePaint.setAntiAlias(false); 
      circlePaint.setAntiAlias(false); 
      mPaint.setAntiAlias(false); 
      mPaint.setColor(0xFF000000); 
      outercirclePaint.setColor(0x44FFF000); 
      circlePaint.setColor(0xF57F35); 
      outercirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      circlePaint.setStyle(Paint.Style.FILL); 
      mPaint.setStyle(Paint.Style.STROKE); 
      mPaint.setStrokeJoin(Paint.Join.MITER); 
      mPaint.setStrokeCap(Paint.Cap.ROUND); 
      mPaint.setStrokeWidth(20); 
      outercirclePaint.setStrokeWidth(15); 
      mCanvas = new Canvas(); 
      mPath = new Path(); 
      paths.add(mPath); 
     } 
     public void colorChanged(int color) { 
      mPaint.setColor(color); 
     } 
     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      super.onSizeChanged(w, h, oldw, oldh); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 

      for (Path p : paths) { 
       canvas.drawPath(p, mPaint); 
      } 

     } 

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

     private void touch_start(float x, float y) { 
      mPath.reset(); 
      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 (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 
      } 
     } 

     private void touch_up() { 
      mPath.lineTo(mX, mY); 
      // commit the path to our offscreen 
      mCanvas.drawPath(mPath, mPaint); 
      // kill this so we don't double draw 
      mPath = new Path(); 
      paths.add(mPath); 
     } 

     @Override 
     public boolean onTouch(View arg0, MotionEvent event) { 
      float x = event.getX(); 
      float y = event.getY(); 

      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // if (x <= cx+circleRadius+5 && x>= cx-circleRadius-5) { 
       // if (y<= cy+circleRadius+5 && cy>= cy-circleRadius-5){ 
       // paths.clear(); 
       // return true; 
       // } 
       // } 
       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; 
     } 
    } 
} 

现在,我想重置画布。有人能帮我吗?

错误

by using this code got error   02-05 11:50:03.169: E/AndroidRuntime(7542): FATAL EXCEPTION: main 
02-05 11:50:03.169: E/AndroidRuntime(7542): java.lang.NullPointerException 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at com.example.undoredo.MainActivity$1.onClick(MainActivity.java:52) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.view.View.performClick(View.java:4204) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.view.View$PerformClick.run(View.java:17355) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.os.Handler.handleCallback(Handler.java:725) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.os.Looper.loop(Looper.java:137) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-05 11:50:03.169: E/AndroidRuntime(7542):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 

回答

0
Path path = new Path(); 
Paint clearPaint = new Paint(); 
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
canvas.drawRect(0, 0, 0, 0, clearPaint); 
+0

while using this code getting error in PorterDuff and it can be imported .. – user2841300

+0

add import android.graphics.PorterDuff.Mode; –

+0

代码已更新并显示错误 – user2841300

0

尝试调用canvas.restore()根据文档:

恢复

此调用平衡以前调用保存(),并用于删除 矩阵/剪辑状态si的所有修改最后一次保存电话。 调用restore()的次数超过save()的调用次数是错误的。

节省

此呼叫平衡以前调用保存(),以及用于去除自上次保存调用 所有修改到基质/削波状态。 调用restore()的次数超过save()的调用次数是错误的。

因此,您可以先调用canvas.save(),然后在清理时调用restore。