Android在绘图应用程序中实现撤消堆栈

时间:2011-07-24 01:18:36

标签: android view runnable ondraw

我开始研究Android SDK中的Finger Paint应用示例,以便更熟悉图形。最近我一直在尝试实现撤销/重做,而且我已经尝试过各种方式遇到路障。我已经找到了一些相关的线索,但没有一个让我超越这些问题。以下是我的主要2项试验:

策略1:

保存一堆路径(或画布)并在撤消时清除屏幕并重绘除最后一个路径之外的每个路径(或恢复最近的画布)。

这里的问题可能很简单,但我无法让视图重绘任何东西。如何绘制已保存的路径(或恢复已保存的画布)?

策略2:

每次触摸后使用getDrawingCache()保存一堆位图。在撤消时,将最后一个位图放回去。

保存必须通过post()从runnable运行,因此它在onDraw()完成后执行(post在invalidate()之后将其添加到系统消息行)。问题是当从runnable中运行时getDrawingCache()总是返回绘画的初始版本,就像它在第一个版本之后看不到任何变化一样。

为什么getDrawingCache()从runnable调用时,看不到视图的当前状态?

我一直在争吵。感谢。

case MotionEvent.ACTION_UP:
touch_up();
invalidate();
Runnable r = new Runnable(){
    @Override
    public void run() {
    myView.storeView();
    }
};
myView.post(r);
}

public void storeView(){
    historyCount++;
    if(historyCount > historySize) historyCount = 6;    //We don't want more than 6                        
    history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}

1 个答案:

答案 0 :(得分:4)

对于策略1,您需要定义一个数据结构,该结构表示呈现绘图的一部分所需的所有信息。因此,例如,如果通过跟踪用户的触摸位置绘制绘图的一部分,请定义一个数据结构,该结构由当前颜色,绘图形状和由一个用户手势生成的坐标ArrayList组成。当您按照用户的触摸,绘制到屏幕时,还会将触摸坐标附加到ArrayList以获取当前手势。触摸结束时,将数据结构推送到撤消堆栈,等待下一个用户手势创建下一个结构实例并开始填充。

如果你有各种手势(填充,手绘痕迹,直线等),你可以为每个手势设置一个单独的结构。它们都可以从一个抽象类继承,所以它们都可以进入堆栈。

第二种策略让我印象深刻的是一种可怕的记忆力。我想我们必须看到你的代码才能理解为什么它没有按预期工作。