gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:13:54 25 4
gpt4 key购买 nike

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

策略一:

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

这里的问题可能很简单,但我无法让 View 重绘任何内容。如何绘制保存的路径(或恢复保存的 Canvas )?

策略 2:

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

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

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

我一直在和这个斗争。谢谢。

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

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

第二种策略给我的印象是可怕的内存力消耗。我想我们必须查看您的代码才能理解为什么它没有按预期工作。

关于Android 在绘图应用程序中实现撤消堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6804380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com