Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.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_Android View_Undo_Redo - Fatal编程技术网

Android 撤消重做功能不起作用。

Android 撤消重做功能不起作用。,android,android-view,undo,redo,Android,Android View,Undo,Redo,我正在为android用户开发一个绘图应用程序。我想在我的应用程序上实现撤消重做功能。我在引用stackoverflow上发布的问题来解决我的问题,但我无法为我的代码找到正确的解决方案。下面我发布我的代码,请帮助我摆脱这个问题。任何帮助将不胜感激 先谢谢你 public class DrawingView extends View { private ArrayList<Path> paths = new ArrayList<Path>(); private Arr

我正在为android用户开发一个绘图应用程序。我想在我的应用程序上实现撤消重做功能。我在引用stackoverflow上发布的问题来解决我的问题,但我无法为我的代码找到正确的解决方案。下面我发布我的代码,请帮助我摆脱这个问题。任何帮助将不胜感激

先谢谢你

public class DrawingView extends View {

 private ArrayList<Path> paths = new ArrayList<Path>();
 private ArrayList<Path> undonePaths = new ArrayList<Path>(); 

public DrawingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    this.context = context;
    setupDrawing();
}

public void setupDrawing(){

    drawPath = new Path();
    drawPaint = new Paint();

    canvasPaint = new Paint(Paint.DITHER_FLAG);

    brushSize = getResources().getInteger(R.integer.medium_size);
    lastBrushSize = brushSize;

    drawPaint.setColor(paintColor);

    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);

    paths.add(drawPath);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
//view given size
    super.onSizeChanged(w, h, oldw, oldh);

    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

@Override
protected void onDraw(Canvas canvas) {
    //draw view
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
    for(Path p : paths){
        canvas.drawPath(p, drawPaint);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    float touchX = event.getX();
    float touchY = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    //  undonePaths.clear();
        drawPath.moveTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_MOVE:
        drawPath.lineTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_UP:
    //  drawPath.lineTo(touchX, touchY);
        drawCanvas.drawPath(drawPath, drawPaint);
        drawPath.reset();
        drawPath = new Path();
        paths.add(drawPath);  
        break;
    default:
        return false;
    }
    invalidate();
    return true;   
}


public void onClickUndo(){
    if(paths.size()>0){
        undonePaths.add(paths.remove(paths.size() - 1));
        Toast.makeText(getContext(), "Undo is working", Toast.LENGTH_LONG).show();
        invalidate();
    }
    else{
        Toast.makeText(getContext(), "Undo is not working", Toast.LENGTH_LONG).show();
    }
}

public void onClickRedo(){
    if(undonePaths.size()>0){
        paths.add(undonePaths.remove(undonePaths.size() - 1));
        Toast.makeText(getContext(), "Redo is working", Toast.LENGTH_LONG).show();
        invalidate();
    }
    else{
        Toast.makeText(getContext(), "Redo is not working", Toast.LENGTH_LONG).show();
    }
}

}
公共类DrawingView扩展视图{
私有ArrayList路径=新ArrayList();
private ArrayList undonePaths=new ArrayList();
公共绘图视图(上下文、属性集属性){
超级(上下文,attrs);
//TODO自动生成的构造函数存根
this.context=上下文;
设置绘图();
}
公共图纸(){
drawPath=新路径();
drawPaint=新油漆();
画布绘制=新绘制(绘制抖动标志);
brushSize=getResources().getInteger(R.integer.medium\u size);
lastBrushSize=笔刷大小;
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(真);
drawPaint.设置行程宽度(刷号);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(绘制.连接.圆形);
drawPaint.setStrokeCap(油漆盖圆形);
添加(drawPath);
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
//查看给定的大小
super.onSizeChanged(w,h,oldw,oldh);
canvasBitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
drawCanvas=新画布(画布位图);
}
@凌驾
受保护的void onDraw(画布){
//绘图视图
drawBitmap(canvasBitmap,0,0,canvasPaint);
canvas.drawPath(drawPath,drawPaint);
用于(路径p:路径){
画布.drawPath(p,drawPaint);
}
}
@凌驾
公共布尔onTouchEvent(运动事件){
float touchX=event.getX();
float touchY=event.getY();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
//撤销海王星。清除();
drawPath.moveTo(touchX,toucy);
打破
case MotionEvent.ACTION\u移动:
drawPath.lineTo(touchX,touchY);
打破
case MotionEvent.ACTION\u UP:
//drawPath.lineTo(touchX,touchY);
drawCanvas.drawPath(drawPath,drawPaint);
drawPath.reset();
drawPath=新路径();
添加(drawPath);
打破
违约:
返回false;
}
使无效();
返回true;
}
公共void onClickUndo(){
if(path.size()>0){
undonePaths.add(path.remove(path.size()-1));
Toast.makeText(getContext(),“撤消正在工作”,Toast.LENGTH_LONG.show();
使无效();
}
否则{
Toast.makeText(getContext(),“撤消不起作用”,Toast.LENGTH_LONG.show();
}
}
public void onClickRedo(){
如果(撤消路径大小()>0){
add(undonePaths.remove(undonePaths.size()-1));
Toast.makeText(getContext(),“重做正在工作”,Toast.LENGTH_LONG.show();
使无效();
}
否则{
Toast.makeText(getContext(),“重做不起作用”,Toast.LENGTH_LONG.show();
}
}
}

只是一些小改动

在您的列表中有一个额外的
路径
,当其他步骤被纠正时,该路径将导致撤销/重做步骤实际上什么也不做。因此,在
setupDrawing()中删除:

paths.add(drawPath);
onDraw()方法中,删除:

canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
drawBitmap()
调用正在重新绘制在每个
操作上绘制到的成员位图,使其看起来好像您的
路径
列表没有被更新

然后,在
onTouchEvent()
方法中的
MotionEvent.ACTION\u DOWN
un comment:

undonePaths.clear();
并将
MotionEvent.ACTION\u UP
案例更改为:

case MotionEvent.ACTION_UP:
    drawCanvas.drawPath(drawPath, drawPaint);
    paths.add(drawPath);  
    drawPath = new Path();
    break;
reset()
调用正在清除您不需要的
路径。相反,这里我们将最近完成的
路径添加到列表中,然后创建一个新路径以继续

注意:按照目前的工作方式,撤消/重做功能不会影响
画布位图
。由于不清楚这个位图的用途,我将它保留原样。如果希望此位图镜像视图,只需将
drawCanvas.drawPath()
调用移动到
onDraw()
,与那里的
canvas.drawPath()
调用并行。

var undoRedo=new Array();
var undoRedo = new Array();
var unStep = -1;

function historySave() {
    unStep++;
    while (undoRedo.length > 20) {
        undoRedo.shift();
        unStep--;
    }
    if (unStep !== 0 && unStep < undoRedo.length) {
        undoRedo.length = unStep;
        unStep++;
    } else {
        undoRedo.length = unStep;
    }
    undoRedo.push(document.getElementById('drawingCanvas').toDataURL());    
}

function Undo() {
    if (unStep > -1) {
        unStep--;
        var canvasPic = new Image();
        canvasPic.src = undoRedo[unStep];
        drawingContext.clearRect(0,0,drawingCanvas.width,drawingCanvas.height);
        canvasPic.onload = function () {
        drawingContext.drawImage(canvasPic, 0, 0);
            }
    }
}

function Redo() {
    if (unStep < undoRedo.length - 1) {
        unStep++;
        var canvasPic = new Image();
        canvasPic.src = undoRedo[unStep];
        canvasPic.onload = function ()  { 
        drawingContext.drawImage(canvasPic, 0, 0);
        }
    }
} 
var unStep=-1; 函数historySave(){ unStep++; while(undoRedo.length>20){ undoRedo.shift(); 取消步骤--; } if(unStep!==0&&unStep-1){ 取消步骤--; var canvasPic=新图像(); canvasPic.src=undoRedo[unStep]; clearRect(0,0,drawingCanvas.width,drawingCanvas.height); canvasPic.onload=函数(){ drawingContext.drawImage(canvasPic,0,0); } } } 函数Redo(){ 如果(取消步进
单击“撤消”时发生了什么?它是说“撤销不起作用”还是说你有一些不想要的效果?你的代码在没有画布的情况下工作得很好。但我需要让它和画布一起工作。我指的是本教程。请建议我也使用canvasBitmap。canvasBitmap的作用是什么?也就是说,它的功能是什么?它是一个模式填充位图,我可以通过手指触摸来选择和绘制。请参阅此链接。有些图案像草地和天空位图。“这是一个填充图案的位图”-不,不是。它是一个“缓冲区”,用于在
onDraw()调用之间保存视图的图像