Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在绘图应用程序中撤消_Android - Fatal编程技术网

Android 在绘图应用程序中撤消

Android 在绘图应用程序中撤消,android,Android,在开始之前,我希望您告诉我,我正在使用一种非常不合适的方法来执行撤消操作。 我有一个绘图应用程序,它将保存您在视图上绘制的每个笔划,当您退出应用程序时,最终图像将复制到文件夹中,其他图像将被删除 现在,在视图上绘制笔划时,每个文件都将保存在临时文件中。文件夹和每个文件的路径将被插入到数据库中,这是为了实现撤消操作。当用户单击撤消时,最后插入的valuepath将被删除,并需要下一条路径。 我的计划是使用此路径在视图上绘制图像,因此每次用户撤消时,将删除保存在数据库中的最后一条路径,并采用下一条路

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

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

希望你明白我的意思。。! 现在我的问题是,我无法将图像绘制到视图中, 我有一个绘制斯托克斯山脉的自定义视图

看法

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

有谁能给我提出更好的建议吗。 如果你有一些示例代码,如果你有不同的想法,这将是一个很大的帮助

提前谢谢


快乐编码

嗯,我根本不会将位图存储在文件中。如果它是一个简单的绘图应用程序,那么你可以我只要有一个数组列表,比如说20个位图,然后将位图存储到列表中。如果长度超过20,则删除第一项。这将为您提供一些撤消缓冲区,并允许您更轻松地处理该操作。至于保存到sd卡,请看

~Aedon

编辑1:

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

public Bitmap toBitmap(Canvas canvas) {
    Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    canvas.setBitmap(b);
    draw(canvas);
    return b;
}
示例侦听器:

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;
        }
    }
};
onDrawcanvas的外观与此类似:

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

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

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

您好,感谢您回答我的问题,我认为使用堆栈是一个很好的建议,但我的疑问是,每次用户单击“撤消”时,如何从画布中获取位图?当您绘制到画布时,请声明位图。当用户单击“撤消”时,画布将必须更新。只需在列表中最后绘制最后一个已知位图。好的……我们如何通过创建新的画布对象来更新画布。像这样->mCanvas=新建画布位图?嗯,我真的不能很好地解释我自己,所以请使用我答案中的示例代码来帮助您解决这个问题。
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();
    }