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 に答える