我将创建一个应用程序,因为我必须实现撤消和重做功能。 在应用程序中,将有多个对象位于舞台上,用户可以自定义 物体的位置。但是,当用户点击“撤消”时,对象将恢复为默认值 位置和点击重做对象后将移动到新位置。
所以我的问题是如何在我的应用程序中应用这些功能? 有没有图书馆或任何第三方课程?
有人可以帮助我吗?
提前致谢。
答案 0 :(得分:5)
看看command pattern。它非常适合撤消/重做类型问题。
答案 1 :(得分:0)
如果您只想要两种不同的状态(默认和“更改”),那么实现它应该是非常简单的。存储数组中每个对象的新值和更新值,并在按“撤消”或“重做”时设置相关数组的位置。
如果你需要更复杂的东西,你可以将你所做的一切都存储为可以撤销的“动作”。例如,有一个类(例如“Action”)有几个子类(“Move”,“ChangeColor”等)。它们包含它们执行的更改(我们应该移动多少像素)和执行操作的方法(移动对象X像素)和撤消操作(移动对象-X像素)。
答案 2 :(得分:0)
我能想到的最简单的方法是创建一个操作对象,其中包含旧状态,新状态和更改的对象。
每次触发撤消功能的操作时,请在操作对象
中填写此数据当你点击撤消时,恢复到对象的before状态并将动作推入重做堆栈。
这应该能够处理最常见的更改。删除/取消删除之类的东西需要一些额外的调整。我只是在删除时放入所有属性,并在处理撤消时使用create函数。
我建议使用字符串作为前后状态的参数和值组合,这样就可以在不改变撤消/重做功能的情况下处理其他功能。
这更像是一种快速而肮脏的方式,您也可以使用设计模式和适当的OOP方式来处理此问题,正如其他人所提到的那样。
答案 3 :(得分:0)
package com
{
import flashx.undo.IOperation;
public class UndoOperation implements IOperation
{
private var _previousX:Number = 0;
private var _previousY:Number = 0;
private var _previousObj:Object = new Object();
private var _currentX:Number = 0;
private var _currentY:Number = 0;
private var _currentObj:Object = new Object();
private var _shape:Object = new Object();
public function TransformOperation(currentObj:Object,previousObj:Object,previousX:Number, previousY:Number, currentX:Number, currentY:Number)
{
_previousX = previousX;
_previousY = previousY;
_previousObj = previousObj;
_currentX = currentX;
_currentY = currentY;
_currentObj = currentObj;
_shape = _currentObj;
trace('Transform _previousX: '+ _previousX +' _previousY: ' +_previousY+' _currentObj '+_currentObj+' _shape '+_shape);
trace( 'trans _currentX '+ _currentX +' '+'_currentY '+ _currentY );
}
public function performUndo():void
{
_shape = _currentObj;
//trace('_shape.x '+_shape.x+" _shape.y "+_shape.y);
_shape.x = _previousX;
_shape.y = _previousY;
//trace(_previousX +' '+ _previousY +' '+ _previousWidth +' '+ _previousHeight +' '+ _previousScaleX +' '+ _previousScaleY +' '+ _previousRotation);
//trace('_shape.x '+_shape.x+" _shape.y "+_shape.y);
//trace('_currentX '+ _currentX +' '+'_currentY '+ _currentY);
}
public function performRedo():void
{
_shape.x = _currentX;
_shape.y = _currentY;
trace(_currentX+' '+ _currentY);
}
}
}
这是我的自定义类,用于撤消和重做舞台上的多个对象。有不同的模式可以用于撤消和重做操作,但对我来说这是撤消和重做的简单方法。我已经在我的项目中完美而成功地实现了这一点。
要使用此类,只需导入类
import flashx.undo.UndoManager;
之后
public static var _undo:UndoManager=new UndoManager();
public static var _redo:UndoManager=new UndoManager();
public static var PrevX:Number=0;
public static var PrevY:Number=0;
var operation:TransformOperation = new TransformOperation(this,this,PrevX,PrevY,this.x,this.y);
_undo.pushUndo(operation);
之后创建撤消和重做的点击事件:
public static function Undo(e:MouseEvent):void
{
_redo.pushRedo(_undo.peekUndo());
_undo.undo();
if(_undo.peekUndo()==null)
{
PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("undo_mc").removeEventListener(MouseEvent.CLICK,Undo);
}
PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("redo_mc").addEventListener(MouseEvent.CLICK,Redo);
}
public static function Redo(e:MouseEvent):void
{
_undo.pushUndo(_redo.peekRedo());
_redo.redo();
if(_redo.peekRedo()==null)
{ PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("redo_mc").removeEventListener(MouseEvent.CLICK,Redo);
}
PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("undo_mc").addEventListener(MouseEvent.CLICK,Undo);
}
对我而言这很好......希望这也有助于其他人...... :)