履歴を維持するためにflex4でUndoRedo操作を実装するにはどうすればよいですか?ダイアグラムを作成および編集するためにflexUIComponentおよびDisplayObjectsを使用していますが、flexではユーザーの操作履歴を直接処理する方法はありません。これを達成するためのアイデアはありますか?
3 に答える
executeメソッドとundoメソッドを使用して、すべてのアクションにコマンドパターンを実装し、それらをキューに入れることができます。
したがって、ユーザーが何かをしたい場合は、AddFiveToTotalクラスを作成して、次のように実行します。
public method execute():void{
totalModel.add( 5 );
}
このクラスはFIFOキューに保存されます。
ユーザーが元に戻す必要がある場合、コマンドがポップされ、元に戻す関数が呼び出されます。
public method undo():void{
totalModel.subtract( 5 );
}
やり直し可能性のために、ポップせず、キューを繰り返すだけです
Mementoパターンも見てください
現在人気のあるMVC(S)フレームワークのいずれかを使用している場合は、間違いなく、誰かがすでに作成したutilを見つけるでしょう。
あなたはの助けを借りて達成することができますmemento pattern
。すべてのプロパティをより適切に追跡することは困難です。プロパティが元に戻す/やり直し操作に使用する必要があるものを把握できます。
ソースコード付きのデモサンプルhttp://www.flairpy.com/mementoPattern/MementoSample.html
この問題に対処する方法はいくつかあります。まず、キャンバス全体の状態をVector
(つまり、ユーザーがステージ上で実行できるすべてのことのリスナーを持ち、変更後に状態を保存する)に保持し、次に現在の状態のインデックスを保存して、次のことができるようにします。あなたの中を移動しVector
、必要な状態をステージに置きます。これは元に戻す/やり直し機能にアプローチする最も簡単な方法ですが、オブジェクトのクローンをたくさん作成する必要があり、多くのオブジェクトまたは多くの元に戻すを処理する場合、これはメモリを大量に消費することになります。 /redos。
Vector
2番目のアプローチは、そのベクトルで変更されたものだけを保持することです。これにより、多くのオブジェクトを作成して複製する必要はなく、変更されたすべてのプロパティとその最後の値を含む1つのオブジェクトのみを保存します。これにより、次のようなものが得られます。
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);
繰り返しますが、それらを記録したい場合は、すべての動きと変化に耳を傾ける必要があります。