- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究如何编写一个支持撤消的绘制程序,并看到很可能命令模式是我想要的。不过,有些事情仍然让我无法理解,我希望有人可以提供一个简单的答案或确认。
基本上,如果我要体现撤消命令的能力,例如在屏幕上标记一个实心圆圈,这是否意味着我需要将圆圈覆盖到内存中的帧缓冲区复制到这个命令对象中?我看不出有任何其他方法可以撤消可能发生的事情,例如,在一堆随机像素颜色上加盖印章。
我听说一种方法只是跟踪前向操作,当执行撤消时,您只需从第 1 步开始并向前拉到撤消前的步骤,但如果您要支持大型操作,这似乎不可行撤消堆栈。
也许解决方案介于您保留每 15-20 个 Action 的位图并从最后一个“保存”转发开始之间。
有人可以提供有关在这种情况下典型接受的方法是什么的任何见解,或者在命令中保存缓冲区矩形,重做每个 Action ,或者我完全错过了什么?
更新:很多很好的回应。谢谢大家。我正在从我正在阅读的内容中考虑,我将通过每 N 个操作保存缓冲区来解决此问题,并且当用户发出撤消命令时,从最近保存的缓冲区中重做所有命令。我可以将 N 调整到尽可能高的值,不会明显影响需要响应式撤消的用户体验(以最大限度地减少内存使用),但我怀疑在这一点上没有真正确定,我应该是能够在一帧中执行相当多的 Action ,这还不算太糟糕。希望这种方法能让我快速确定是否转向另一个方向,而是为需要它的操作保存先前状态的位图矩形。
最佳答案
首先,小心过度设计:如果您的应用程序不复杂且图像很小,您可能会发现“只存储所有内容”是快速、便宜且可行的。但假设不是这样:
您是正确的,从第 1 步开始为每个撤消重新绘制整个 Canvas 是不可行的;除非您的绘图程序非常简单,否则某些操作需要的时间太长。此外,可能不需要无限的撤消缓冲区(并且存储起来可能非常占用空间)。
如果你的艺术项目很复杂,我实际上会从混合方法开始,以处理各种操作。每隔一段时间保存一次帧缓冲区(您建议的每 15-20 个命令似乎没问题;我可能会从 10 个开始,一旦我工作了就进行调整)并从上次保存继续。但是不要让“每 15 次操作”变得死板,因为一些额外的经验法则可能会让用户看起来更加流畅。
例如,一些耗时或难以反转的操作总是会创建一个新的保存点:
- 任何 Canvas 调整大小(裁剪等)
- 任何保存。 (“我刚刚保存”是用户很可能撤消回的地方。)
- 任何非常耗时的操作都应该在操作之后而不是之前创建一个新的保存点;即它应该标记下一个操作以保存缓冲区以撤消。 (为什么?如果操作需要 30 秒,您不希望之后堆栈中的每个撤消都需要额外的 30 多秒。)
- 相反,任何具有易于执行的数学负片或自反转(如光负片)的操作都无需费心保存帧缓冲区,也不应计入下一次保存。
所有这些都忽略了层的问题。如果你的程序有它们,显然只保存那些改变的层就足够了。
绝对是我的最高优先级建议:无论您使用什么方法,您都应该始终为最近执行的操作保存帧缓冲区。 “糟糕,不是那个意思”是撤消的最可能原因,因此您总是希望撤消一步能够响应。如果它不是您保留的缓冲区,则可以在下一个命令执行后丢弃此缓冲区。
您还需要考虑什么构成了一个原子撤消操作。 (例如,一个笔刷工具的一组笔画是一个操作还是多个操作?两者都有优点和缺点。)
关于command - 撤消绘画程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3944552/
示例:我在 C 列中有一个公式,它是 A 和 B 列中值的函数。当我更改 A 或 B 中的值并按 Enter 键时,C 中的值会自动更新。但是,当我 Ctrl-Z 时,C 列中的值不会自动恢复到我更改
我使用 Eclipse 进行几乎所有语言的编程。我也喜欢用于快速编辑的 vim 快捷方式,所以我安装了 vrapper。问题是当我写了很多代码,我只想撤消一些小东西。它撤消了很多代码块,而不是 2 或
假设我们无意中将命名分支( ABC ) merge 到我们的 default 中。分支。 hg rollback不是一个选择,因为从那以后有几次提交。 有没有办法撤销这个? 最佳答案 您将需要 Mq
有什么办法可以实现这一点吗?我正在使用一个分页插件,它读取 ul 中的 li 数量,并确定要吐出的编号链接的数量。 最佳答案 您可能想使用 .hide() 并检查 li 是否可见。 这可以通过以下方式
我需要能够检测是否触发了“撤销”,以及它是否对我的 RichTextBox 的内容产生了影响。 当我在 RichTextBox 中键入内容,然后按 Ctrl+Z 时,windows 似乎会为我处理撤消
我的每个 php 页面的顶部都有以下代码: foreach ($_POST as $key => $value) { if (!is_array($value)) {
我正在为一个类的项目工作,我们应该在该类中实现文本编辑器的基本功能,包括撤消和重做。我目前的撤消/重做功能正常工作,唯一的问题是,我在尝试从 Command 中释放内存时遇到 valgrind 错误。
假设我有以下两个变量: bob1 = u'bob\xf0\xa4\xad\xa2' bob2 = 'bob\xf0\xa4\xad\xa2' 如何让 bob1 的值成为 bob2 的值?也就是说,我如
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 1 年前。 社区在 1 年前 审查了是否重
我已经成功地实现了 touchesMoved 并且它正在正确地绘制线条,现在我在实现删除方法时遇到了问题,请在我缺少的地方帮助我。 - (void)touchesMoved:(NSSet *)touc
我使用的是 Visual Studio 2015。TFS 的版本是 2012(版本 11.0.51106.1)。有没有办法撤销 unshelve,其他用户的 shelfset,有 unshelve 命
我正在使用 intelliJ 在功能分支上工作,我想将我的团队在 master 上所做的更改集成到我的分支中,但我搞砸了。 我检查了 master,从 Git pop 窗口中我选择了功能分支并选择了“
我的情况:我克隆了一个存储库(内核的源文件)。然后检查了一个分支,并构建了内核。二进制文件已存储在工作树的子目录中。现在,我想放弃所有本地更改,包括构建的二进制文件,并恢复到克隆存储库的不同分支。 我
我正在使用 SourceTree,我在“工作副本更改”部分下有一些修改过的文件,这些文件正在被跟踪,如图中的黄色图标所示。但我放弃了这些变化。现在如何恢复这些更改? 最佳答案 如果项目未暂存(在顶部
撤消特定提交的最简单方法是: 不在头部或头部 已推送到远程。 因为如果不是最新的提交, git reset HEAD 没用。并且因为它已经被推送到远程, git rebase -i 和 git reb
我有一个 Pdf 文件,每页包含几张幻灯片,包括文本(不仅是图像)。 该 pdf 可能是使用 pdfnup 创建的。 我可以恢复 pdfnup 操作,以便每张幻灯片都显示在一页上吗? 最佳答案 据我所
我正在进行合并。合并后,我提交所有文件而没有冲突。然后我解析单个文件并提交它们。如果我犯了一个错误,我该如何重做解析(即使我还没有提交解析文件)? 与预期相反,我无法还原文件。合并后恢复到任何步骤时,
当之后进行了 17 次提交时,如何撤消不应该进行的提交? 背景:我团队的一个同事单独工作了一个月,现在是时候将他们的分支 merge 到 master 上了。但是,其中一个提交包含一个太大的文件,无法
我正在尝试使用Command Pattern在我的应用程序中实现撤消/重做功能。我遇到了一个问题。 为了说明这一点,让我们假设您可以使用我的应用程序2D配置文件创建(任意数量)。 然后,可以从这些2D
我有一个工作流,我将描述如下: [ Dump(query) ] ---+ | +---> [ Parquet(d
我是一名优秀的程序员,十分优秀!