0

我以前在手指画课上工作过,我很舒服,但这次我发现自己在实现撤销和删除这两个功能时遇到了很大的麻烦

这是我的绘图视图

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

4

1 回答 1

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(); 
    }

我已经在我的应用程序中实现了这一点。希望对你有效。

于 2013-07-22T08:21:01.620 回答