gpt4 book ai didi

java - 类似 Photoshop 的移动应用程序的高效撤消/重做

转载 作者:行者123 更新时间:2023-11-29 06:20:32 25 4
gpt4 key购买 nike

我正在尝试为移动设备 (Android) 编写一个绘画应用程序,它比 MS Paint 具有更多的功能(例如各种画笔和画笔设置、选择、图层),但不会像 Photoshop 那样复杂.我需要我的应用程序具有良好的撤消/重做功能。无限撤消/重做可能是不可能的。我很高兴能够撤消最后一分钟的用户操作(可能大约 20 个操作)。

我知道的撤消/重做的主要方法是:

  1. 保存整个状态或仅保存每次操作后更改的位。撤消涉及通过恢复快照来更新状态。优点:易于实现缺点:占用大量内存。

  2. 使用命令模式,其中每个命令都有“执行操作”和“撤消操作”方法。要撤消,只需调用先前命令的撤消操作即可。优点:内存效率高,缺点:实现起来复杂得多。

我必须考虑的病态撤消/重做场景是:

  • 用户一次在整个 Canvas 上作画,当用户点击撤消时,您会希望撤消整个操作。对于选项 1,我们需要存储整个 Canvas 大小的位图。

  • 用户画了一些东西,将图像 1.jpg 导入到 Canvas 上,再画了一些,然后 1.jpg 然后在某个时候被另一个应用程序删除/修改,然后用户想要撤消然后重做他们所有的绘画应用程序中的操作。我真的不确定如何在此处正确撤消而不保存撤消堆栈上任何导入图像的副本。

任何人都可以就如何在内存和处理器速度较低的移动设备上最好地实现撤消/重做提出任何建议吗?我喜欢 1 和 3 的简单性,但似乎唯一现实的选择是 2。不过我不确定如何用这个选项来处理我的第二个病态示例。

最佳答案

在 iPhone 上,Core Data 内置了对撤销和重做的支持。只需让您的数据模型反射(reflect)绘制的对象,您就可以轻松地在保存之间来回滚动它。通常您会保存用于创建图形而不是图形本身的过程和对象。


编辑:

OK, but this is just a little API support for implementing number 2 and won't help with the examples I gave.

实现这项工作的关键思想是,您不将数据模型配置为模态并保持程序的图形输出,而是将其配置为模态并保持过程 创建图形输出。

创建图形程序的简单方法是像这样设置数据流:

Input_UI-->Display_UI-->Data_Model

用户操作 Input_UI 直接改变 Display_UI 的屏幕图形。只有当用户保存时,Data_Model 才会发挥作用。这种类型的数据流使得撤消/重做(和其他事情)很难实现,尤其是在绘画中。合成程序。每个单独的操作都必须知道如何撤消自身,并且必须能够对更改后的图形进行操作。

更好的方法是像这样设置数据流:

Input_UI-->Data_Model-->Display_UI

用户操作 Input_UI,后者与 Data_Model 通信,后者操作用户选择的操作。 Data_Model 记录过程,例如“在矩形 {0,0,100,100} 处添加文件 jpg.1”。对 Data_Model 的更改会向 Display_UI 发送通知,后者会读取更改的数据并执行所描述的过程。

Data_Model 自行回滚,Display_UI 只是绘制 Data_Model 告诉它的内容。 Display_UI 根本不需要了解撤消过程。

在绘图程序中,您将创建单个图形对象的逻辑层,因此重做只是按照添加的相反顺序删除层的问题。对于绘画/合成程序,您必须从最后一个保存点开始并重新创建图形,直到最后一步。

因此,在您的合成程序示例中:

  • Data_Model 存储选定区域(整个 Canvas )的坐标,它仍然只是“矩形 {0,0,canvas.width,canvas.height}”,然后是“填充黑色”操作。对于撤消,Display_UI 将图像拉回到最后一个保存点,然后不可见地应用对 last-1 所做的更改。
  • 您只需要保存图像的缓存,直到下一次保存。此时,Data_Modal 提交所有更改并将组合导出到文件中。下次应用程序启动时,它会从上次的图像开始。如果您想要无限撤消,那么是的,您必须永久保存导入的图像。

解决这个问题的方法是忽略 GUI,而是考虑如何设计一个在没有任何 GUI 输入或输出的情况下从命令行运行的应用程序。 Data_Modal 的工作原理是一样的。它将保存用于创建输出图像的文本命令和数据(例如导入的图像),而不仅仅是屏幕上图像的快照。

关于java - 类似 Photoshop 的移动应用程序的高效撤消/重做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3225047/

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