簡體   English   中英

在Flex中實施撤消重做

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM