在绘图应用程序中撤消

时间:2011-05-12 15:37:59

标签: android

在开始之前,我希望您告诉我使用非常不正确的方法进行“撤消”操作。 我有一个绘图应用程序,它将保存您在视图上绘制的每个笔划,当您退出应用程序时,最终图像将被复制到文件夹,其他图像将被删除。

现在,当您在视图上绘制笔划时,每个文件都将保存在临时文件中。文件夹和每个文件的路径将被插入到数据库中,这是为了实现撤销操作。当用户单击撤消时,将删除最后插入的值(路径),并且将获取下一个路径。 我的计划是使用此路径在视图上绘制图像,因此每次用户“撤消”时,将删除保存在数据库中的最后一个路径,并将采用下一个路径。

希望你有我的想法..! 现在我的问题是,我无法将图像绘制到视图中, 我有一个自定义视图来描绘stokes。

查看

public class MyView extends View {

        private static final float MINP = 0.25f;
        private static final float MAXP = 0.75f;

        private Bitmap  mBitmap;

        private Paint   mBitmapPaint;

        public MyView(Context c) {
            super(c);


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

            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

            mCanvas = new Canvas(mBitmap);
            mCanvas.drawColor(Color.BLACK);

         }

        @Override
        protected void onDraw(Canvas canvas) {

            try{

                 new SaveFileThread().execute(null);        //------->save strokes as files

                Log.i("In ondraw log", "Wow "+filename);

                if(undoflag=="undo" && nextp!="haha"){

                    String pat=UnDo();

                    if(pat!=null){

                        if(pat==filename){ pat=UnDo(); Log.i("undo called twice", "not again");}
                        else{

                        //  Bitmap nbmp=LoadBMPsdcard(pat);
                            //render the SD card image  
                      //      canvas.drawBitmap(nbmp, 0, 0, null);  

                        }
                    }
                    //the parent onDraw() method.  
                 //   super.onDraw(canvas);

                }


            //canvas.drawColor(000000);
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);

            }catch(Exception e){
                e.printStackTrace();
            }

        }

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

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

        @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;
        }
    }

我有一个可以保存的帖子, 如何将SD卡中的图像绘制到此视图中。

任何人都可以建议我做更好的想法。 如果你有一些不同的想法,如果你有一些示例代码,那将是一个很大的帮助。

提前致谢

快乐编码

2 个答案:

答案 0 :(得分:0)

好吧,我根本不会将位图存储在文件中。如果它是一个简单的绘图应用程序,那么你可以(我会)只有一个数组列表,如20位图并将位图存储到列表中。如果长度超过20,请删除第一个项目。这将为您提供一些撤消缓冲区,让您更轻松地处理操作。至于保存到SD卡外观here

〜Aedon

编辑1:

使用此方法创建画布的位图。

public Bitmap toBitmap(Canvas canvas) {
    Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    canvas.setBitmap(b);
    draw(canvas);
    return b;
}

示例onToushListener:

new OnTouchListener() {
    public void onTouch(View v, MotionEvent e) {
        switch(e.getAction()) {
            case MotionEvent.ACTION_DOWN: mIsGesturing = true; mCurrentDrawPath.moveTo(...); // Fall through
            case MotionEvent.ACTION_MOVE: // create the draw path the way you are now.
            case MotionEvent.ACTION_UP: mIsGesturing = false; addNewBufferBitmap(toBitmap(canvas)); break;
        }
    }
};

onDraw(canvas)看起来与此类似:

public void onDraw(Canvas canvas) {
    canvas.drawBitmap(getLastBufferBitmap(), 0, 0, null);
    if (mCurrentDrawPath != null) canvas.drawPath(mCurrentDrawPath, mPathPaint);
    if (mIsGesturing) mCanvas = canvas;
}

答案 1 :(得分:0)

此代码在我的绘图应用程序中运行..

private Slate mSlate;
private TiledBitmapCanvas mTiledCanvas;

 public void clickUndo(View unused) {

        mSlate.undo();
    }


public void undo() {
        if (mTiledCanvas == null) {
            Log.v(TAG, "undo before mTiledCanvas inited");
        }
        mTiledCanvas.step(-1);

        invalidate();
    }