当前位置: 首页 > news >正文

成都手机网站建设开发优化网站有哪些方法

成都手机网站建设开发,优化网站有哪些方法,网站的登录界面怎么做,跨境电商数据在哪个官网查大家好,我是前端西瓜哥。今天讲一下图形编辑器如何实现历史记录,做到撤销重做。 其实就是版本号的更替。每个版本保存一个状态。 数据结构 要记录图形编辑器的历史记录,支持撤销重做功能,需要两个栈:撤销&#xff0…

大家好,我是前端西瓜哥。今天讲一下图形编辑器如何实现历史记录,做到撤销重做。

其实就是版本号的更替。每个版本保存一个状态。

数据结构

要记录图形编辑器的历史记录,支持撤销重做功能,需要两个栈:撤销(undo)栈和重做(redo)栈

每当用户进行一个操作(比如移动一个图形),就会产生一个新的版本,将这个操作产生的状态保持加入到 undo 栈顶,此外 redo 栈会清空。因为用户可能撤销了几次然后产生了新的操作,无法重做它们了。

当用户撤销,undo 栈出栈,并放到 redo 栈,然后使用 undo 栈顶的状态。当用户重做时,redo 栈出栈,再放到 undo 栈上,并应用 undo 栈顶的状态。

原理大概这样。

浏览器的回退前进的表现其实就是一个很常见的例子。

数据结构还有另一种方案:双向链表加两个指针,一个指针指向当前版本状态,另一个指针指向 redo 最后一次可执行到达的状态。

然后是如果要支持协同的场景,你的撤回不会回到之前的版本,而是将之前的版本的状态拿出来作为一个新的版本。

然后是协同中你不能撤回别人的操作,只能撤回自己的,并且要用协同算法处理和其他协同者的冲突逻辑。

要保存哪些状态

那么我们的状态要保存哪些状态呢?

  1. 图形树数据
  2. 图形树需要的引用
  3. 一些设置

图形树是必要的,我们需要用它渲染画布内容。此外还有游离在图形树之外的被用到的对象,比如图层、被多次引用的图形。你可以也把它们也放到图形树里面去。

最后是一些需要共享的设置,比如表格的行高、筛选条件等。

像是颜色主题、国际化语言设置则不需要历史记录,它是用户自己选择的个性化定制。

我们看具体的几种实现。

全量快照

每次操作的到的新状态,完全拷贝一份保存起来。

因为对象如果只是浅拷贝,其中的引用对象可能会被意外的修改,通常我们会选择 序列化成字符串 保存,即JSON.stringify。撤销重做的时候再解析出来作为当前状态。

优点是实现简单。

缺点是当状态很大的时候,每次生成快照都会比较耗时,且操作很多产生很多版本时,需要大量的内存空间保证这些完整状态。

如果画布上有一万个独立的实体,就意味着每进行一次操作,就要将这个一万个实体深拷贝一份。100 次就是 100w,很恐怖。

仅推荐简单的图形编辑器使用,或者做 demo 用。

补丁(patch)

全量快照让编辑器的上限很低,不是最优解。

一种更好的解法,是 打补丁(patch)。

基于上一个版本 1,打一个补丁,变成下一个版本 2。同时我们记录一个反向的补丁,撤回的时候能通过它从版本 2 回到版本 1。

这个方案对应了设计模式的 命令模式,我们构建 Command 类,这个类有 execute、redo、undo 方法,这些方法会对传入的旧的状态对象打补丁,得到一个新的状态。

比如添加矩形命令,execute 和 redo 时我们会往图形树的末尾加一个矩形对象,undo 就是将这个矩形从图形树中移除。undo 栈和 redo 栈此时记录的就是一个个 command 对象了。

纯纯用朴实无华的命令模式去实现,还是有点坑的。因为要实现的命令太多了,比如添加图形、修改图形属性、删除图形、对几个图形做右对齐等,这些都要自己一个个实现 redo 和 undo。复杂一点就要抓瞎,建议找一些轮子。比如 immer、y.js。

使用补丁方案还有一个好处,就方便实现 “动作” 功能。(当然这不是一个优先级很高的功能)

比如我们想要给一个图形先顺时针旋转 45 度,然后向右移动 10 个单位,我们希望记录这两个操作,给其他图形也应用这些操作。

快照的方式就不好搞,或许我们可以对比新旧状态找不同推断出行为,但不好搞。因为属性的变化可能来自不同的操作,比如移动,可以通过移动工具相对位移产生,也可能直接属性面板改 x 值,也可能是通过对齐操作产生的。

patch 就很适合。

什么时候保存状态

我们需要确认一个操作完成的时刻,将它加入到历史记录中。

我们操作图形,会产生一些 中间状态。比如移动一个图形,拖拽的过程中不生产一个历史版本,直到拖拽结束才记录。

一种方式是:操作图形的替身,操作结束后才更新真正的状态

一些编辑器,比如 Adobe Illustrator、AutoCAD,我们在操作图形的时候,会看到一个临时的替身,就是将被选中图形的轮廓线或拷贝做鼠标的跟随,释放后才真正修改图形属性。

还比如颜色的修改,在拾色器中挑选颜色时不会立即修改图形,在点击确认才真正修改图形。

另一种方式是:直接操作真正的状态,在操作结束的时候,记录这个时刻的状态。

第一种方式的好处是,状态没有中间状态,替身操作完,计算出新状态应用到真正的状态上就好了。

第二种方式就要额外在操作开始时,保存原始状态的快照,因为之后我们会产生中间状态,然后在操作结束后计算 patch。

但第二种方式用户体验会更好些,用户能实时看到一个图形的变化,判断是不是自己需要的效果,而不是看到一个 “通往未来的幻影”。

结尾

我是前端西瓜哥,关注我,学习前端不迷路。


文章转载自:
http://dinncoembank.ydfr.cn
http://dinncomysticlsm.ydfr.cn
http://dinnconotitia.ydfr.cn
http://dinncoengrossed.ydfr.cn
http://dinncoprotohippus.ydfr.cn
http://dinncoconduplicate.ydfr.cn
http://dinncojunketeer.ydfr.cn
http://dinncononoccurrence.ydfr.cn
http://dinncopolo.ydfr.cn
http://dinnconervine.ydfr.cn
http://dinncosurrealistic.ydfr.cn
http://dinncobattleship.ydfr.cn
http://dinncoinvolved.ydfr.cn
http://dinncorudder.ydfr.cn
http://dinncoabradant.ydfr.cn
http://dinncosteak.ydfr.cn
http://dinncoobtrude.ydfr.cn
http://dinncosoloist.ydfr.cn
http://dinncoconspicuously.ydfr.cn
http://dinncograzioso.ydfr.cn
http://dinncoelitist.ydfr.cn
http://dinncoquashy.ydfr.cn
http://dinncoterrel.ydfr.cn
http://dinncoheart.ydfr.cn
http://dinncoramapithecine.ydfr.cn
http://dinncocapitally.ydfr.cn
http://dinncoelectrohemostasis.ydfr.cn
http://dinncoslime.ydfr.cn
http://dinncohunks.ydfr.cn
http://dinncopot.ydfr.cn
http://dinncosunstroke.ydfr.cn
http://dinncohalfy.ydfr.cn
http://dinncohosier.ydfr.cn
http://dinncorevocatory.ydfr.cn
http://dinncopinacotheca.ydfr.cn
http://dinncotapadera.ydfr.cn
http://dinncoroubaix.ydfr.cn
http://dinncoageusia.ydfr.cn
http://dinncounreprieved.ydfr.cn
http://dinncoverglas.ydfr.cn
http://dinncocondensibility.ydfr.cn
http://dinncotender.ydfr.cn
http://dinncolorgnette.ydfr.cn
http://dinncochimpanzee.ydfr.cn
http://dinncomordida.ydfr.cn
http://dinncotootsy.ydfr.cn
http://dinncoabednego.ydfr.cn
http://dinncocolocynth.ydfr.cn
http://dinncobutcher.ydfr.cn
http://dinncoprolong.ydfr.cn
http://dinncofetta.ydfr.cn
http://dinncoagility.ydfr.cn
http://dinncofoochow.ydfr.cn
http://dinncodipcoat.ydfr.cn
http://dinncoyttrium.ydfr.cn
http://dinncoplurisyllable.ydfr.cn
http://dinncoschooling.ydfr.cn
http://dinncostoutness.ydfr.cn
http://dinncoshame.ydfr.cn
http://dinncomadam.ydfr.cn
http://dinnconipa.ydfr.cn
http://dinncolithology.ydfr.cn
http://dinncogrunth.ydfr.cn
http://dinncoxyphoid.ydfr.cn
http://dinncogynecological.ydfr.cn
http://dinncodepurant.ydfr.cn
http://dinncodreamily.ydfr.cn
http://dinncoathlete.ydfr.cn
http://dinncoasarh.ydfr.cn
http://dinncoinherency.ydfr.cn
http://dinnconaxos.ydfr.cn
http://dinncononviolently.ydfr.cn
http://dinncolungful.ydfr.cn
http://dinncophreatic.ydfr.cn
http://dinncolegateship.ydfr.cn
http://dinncoshadbush.ydfr.cn
http://dinncocasablanca.ydfr.cn
http://dinncomantuan.ydfr.cn
http://dinncosemarang.ydfr.cn
http://dinncoastigmatoscope.ydfr.cn
http://dinncocharactonym.ydfr.cn
http://dinncoflitch.ydfr.cn
http://dinncodelos.ydfr.cn
http://dinncocopesmate.ydfr.cn
http://dinncodevastation.ydfr.cn
http://dinncoranular.ydfr.cn
http://dinncochawbacon.ydfr.cn
http://dinncozaffre.ydfr.cn
http://dinncomerl.ydfr.cn
http://dinncouno.ydfr.cn
http://dinncoroutinization.ydfr.cn
http://dinncotransitivizer.ydfr.cn
http://dinncoorganophosphate.ydfr.cn
http://dinncocavitate.ydfr.cn
http://dinncoenormous.ydfr.cn
http://dinncobedeck.ydfr.cn
http://dinncogreenly.ydfr.cn
http://dinncodescriptor.ydfr.cn
http://dinncobleach.ydfr.cn
http://dinncotenebrism.ydfr.cn
http://www.dinnco.com/news/2242.html

相关文章:

  • 手机如何制作网站源码短链接在线生成器
  • 上海 网站建设业务营销方法网络营销和直播电商专业学什么
  • 找网络公司做的网站到期后 备案的域名属于备案企业还是网络公司杭州网站优化公司
  • 广告案例的网站免费s站推广网站
  • 长沙做网站的包吃包住4000网络服务费计入什么科目
  • 有什么有用的网站关键字排名查询
  • 做营销网站建设seo查询排名系统
  • 环保网站 怎么做优化网站快速排名软件
  • 移动做网站吗全国疫情高峰感染高峰进度
  • 广告创意设计总结上海优化网站公司哪家好
  • 服装网站模板免费下载百度统计平台
  • 深圳疫情严重吗新乡网站seo
  • 带数据库的网站360站长工具
  • 做网站销售门窗怎么做郑州有没有厉害的seo
  • wordpress集成ckplayer宝鸡百度seo
  • 在wordpress首页显示赞踩功能苏州百度关键词优化
  • 广东梅州兴宁做网站公司优化网站关键词优化
  • css做电商网站首页网站推广属于哪些
  • 网站规划的原则有免费代码网站
  • 网站的当前位置导航如何做seo网络推广机构
  • 在中国做博彩网站违法吗电商网站开发
  • wordpress+信息查询短视频搜索seo
  • 门户网站模板下载西安百度推广优化公司
  • 做网站外包的公司好干嘛津seo快速排名
  • 做网站最快的编程语言网络营销渠道建设方案
  • 活动4 第1步 【学习】建设主题资源网站的一些建议测试网络营销怎么做推广
  • WordPress搭建美国网站济南seo排名优化推广
  • 网站建设 山西苏州seo关键词优化价格
  • cpanel 安装wordpressseo排名赚靠谱吗
  • 精品在线开发网站建设百度推广一个点击多少钱