2

我开始使用 Android SDK 中的示例手指画应用程序来熟悉图形。最近我一直在尝试实现撤消/重做,但我尝试过的每一种方式都遇到了障碍。我找到了一些关于这个的线程,但没有一个能让我解决这些问题。这是我的主要 2 次试验:

策略一:

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

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

策略二:

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

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

为什么从可运行对象调用 getDrawingCache() 时看不到视图的当前状态?

我已经和这个斗争了一段时间。谢谢。

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

1 回答 1

4

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

如果您有各种手势(填充、徒手描线、直线等),您可以为每个手势设置单独的结构。它们都可以从抽象类继承,因此它们都可以进入堆栈。

第二种策略让我觉得是一个可怕的记忆猪。我认为我们必须查看您的代码才能理解为什么它没有按预期工作。

于 2011-07-24T01:55:12.137 回答