向FingerPaint.java添加撤消和删除

时间:2013-02-26 13:33:36

标签: android android-canvas

之前我曾在指纹课上工作过,我非常舒服,但这一次我发现自己在实现撤销和删除功能方面遇到了很大的麻烦

这是我的图纸视图

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,有人建议我使用相同的颜色,所以我创建了一个包装类来存储绘制和路径对象,但它不起作用。

1 个答案:

答案 0 :(得分:0)

我可以帮你删除(清除屏幕)。这是非常简单和基本的方法。 创建一个布尔变量(比如mclears)。按下“清除”按钮时将此项设置为true。 在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(); 
    }

我已在我的应用中实现了此功能。希望它适合你。