[英]Implement an Undo Redo in flex
如何在Flex 4中實施撤消重做操作以維護歷史記錄? 我正在使用flex UIComponent和DisplayObjects來創建和編輯圖,但是在flex中,無法直接處理用戶操作歷史記錄。 有什么想法可以實現這一目標嗎?
您可以使用execute和undo方法為所有操作實現命令模式 ,並將它們排隊。
因此,當用戶想要做某事時-可以說創建一個AddFiveToTotal類並執行:
public method execute():void{
totalModel.add( 5 );
}
然后將此類存儲在FIFO隊列中。
如果用戶需要撤消該命令,則會彈出該命令,撤消函數稱為:
public method undo():void{
totalModel.subtract( 5 );
}
為了重做,不要彈出,只需要迭代隊列
還看一看Memento模式
如果您正在使用任何當前流行的MVC(S)框架,則無疑會找到某個已經創建的實用程序。
您可以借助memento pattern
。 可以更好地跟蹤所有屬性,您可以確定撤消/重做操作需要使用哪些屬性。
帶有源代碼的演示示例http://www.flairpy.com/mementoPattern/MementoSample.html
有幾種方法可以解決此問題。 首先是將整個畫布的狀態保存在Vector
(我的意思是讓用戶監聽舞台上用戶可以做的所有事情,並在更改后保存狀態),然后保存當前狀態的索引,以便您可以遍歷您的Vector
並將所需的狀態放在舞台上。 這是實現撤消/重做功能的最簡單方法,但是請注意,您將不得不大量復制對象,如果您要處理大量對象或執行大量撤消操作,這將成為內存浪費。 / redos。
第二種方法是只保留矢量中已更改的內容,這樣您就不必創建和克隆很多對象,而只需在Vector
保存一個對象,該對象將包含所有已更改的屬性及其最后的值。 這將為您提供以下信息:
private var mHistory:Vector.<Object> = new Vector.<Object>();
private var mCurrentIndex:int = -1;
public function storeState(state:Object)
{
mHistory.push(state);
mCurrentIndex++;
}
public function undo():void
{
if(mCurrentIndex < 1)
return;
mCurrentIndex--;
//here you could test for values that could have changed
var item:DisplayObject = this.getChildByName(mHistory[mCurrentIndex].name);
if(mHistory[mCurrentIndex].x != undefined)
item.x = mHistory[mCurrentIndex].x;
// etc. you get the point. Note that this is only comfortable if only several things can change
}
對storeState
函數的調用將如下所示:
var state:Object = { name:DisplayObjectName, x:120, y:20 };
storeState(state);
同樣,如果要記錄所有的運動和變化,則必須聆聽它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.