【问题标题】:Undo, redo functionality with image manipulation in FlexFlex 中的图像操作撤消、重做功能
【发布时间】:2011-01-07 21:35:38
【问题描述】:

所以我设法学习了一些 Flex 并创建了一个小应用程序:

  • 将图像加载到 Image 组件中
  • 使用矩阵变换图像(旋转、翻转)
  • 应用过滤器

现在我正在考虑创建一些撤消重做功能。 每次我进行转换/添加过滤器时,我都希望能够返回到上一个图像(在动作之前)。

我的想法是有一个数组并将前一个位图添加到堆栈中。 但是我看到转换和过滤器之间存在一些差异 我还看到了 ImageSnapshot 以及我能做什么,它看起来就像我所追求的。

总的来说,我对 Flex 有点陌生,我希望这里的人可以就这方面给我任何建议,并希望能给我一些指导。

感谢您的建议! 最好的问候,

【问题讨论】:

    标签: apache-flex image-manipulation undo-redo


    【解决方案1】:

    我建议查看Command design pattern

    本质上,您的数组将不包含图像,而是表示对图像进行的操作的标记。每个令牌都有足够的信息来撤消(和重做?)其操作。

    var c:Command = new RotateCommand(90, CLOCKWISE);
    c.doWork();
    history.push(c);
    
    // Undo
    var c:Command = history.pop();
    c.undoWork();
    

    然后在命令中,大致:

    public function doWork():void {
        var newTransform:Matrix = calculateTransform(angle, direction); // 90, CLOCKWISE
        image.transform.matrix.concat(newTransform);
    }
    
    public function undoWork():void {
        var newTransform:Matrix = calculateTransform(-angle, direction); // reverse operation
        image.transform.matrix.concat(newTransform);
    

    【讨论】:

    • 很有趣,但有时反其道而行之并不总是等同于将其视为从未做过的事情。它在这种情况下有效,但是像删除对象的子级这样的情况呢,有没有本地方法来处理呢?我很感兴趣,因为这是我将在当前项目中很快解决的要求,我不想手动维护所有撤消功能。
    • doWork() 和 undoWork() 通常与上面的不同。 (对于 DeleteChildCommand,doWork() 必须保存足够的数据,以便 undoWork() 可以重新创建已删除的子项。)有兴趣查看任何其他替代方案。
    • 对另一个 SO 问题的有趣看法:stackoverflow.com/questions/2006404/making-undo-in-python
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多