処理中の画像があり、元に戻すとやり直すという 2 つのボタンがあります。これらの 2 つのボタンのいずれかがクリックされた場合に、前のタッチ操作を元に戻す/やり直すコードが必要です。スタックを使用する必要があることはわかっています。どのように実装すればよいですか?
3 に答える
元に戻す/やり直しを実装するには、主に 2 つのパターンがあります。
- 「思い出」のパターン。
- 「コマンド」パターン。
1.メメントパターン
memento パターンの考え方は、オブジェクトの内部状態全体のコピーを (カプセル化に違反することなく) 保存して、後で復元できるようにすることです。
これは (たとえば) 次のように使用されます。
// Create your object that can be "undone"
ImageObject myImage = new ImageObject()
// Save an "undo" point.
var memento = myImage.CreateMemento();
// do a bunch of crazy stuff to the image...
// ...
// Restore to a previous state.
myImage.SetMemento(memento);
2.コマンドパターン
コマンド パターンの考え方は、オブジェクトに対して実際に実行されるアクションをカプセル化することです。各「アクション」(または「コマンド」) は、オプションでそれ自体をロールバックする方法を知ることができます。または、ロールバックが必要な場合は、コマンド チェーン全体を再度実行できます。
これは (たとえば) 次のように使用されます。
// Create your object that can be "undone"
ImageObject myImage = new ImageObject()
// Create a "select all" command
var command = new SelectAllCommand(myImage); // This does not actually execute the action.
// Apply the "select all" command to the image
selectAll.Execute(); // In this example, the selectAll command would "take note" of the selection that it is overwriting.
// When needed, rollback:
selectAll.Rollback(); // This would have the effect of restoring the previous selection.
それはすべて、タッチイベントが最初に何をするかによって異なります。タッチに応じてアプリケーションが行うことを、スタックを埋めることができるクラスに抽象化する必要があります。そうすれば、スタックの実装は簡単です。
画像操作の場合、ビットマップのスタック全体を保持するには、メモリを消費しすぎる可能性があります。スタックに 2 つまたは 3 つのアイテムをプッシュした後、悪名高い OutOfMemoryException が発生する可能性があります。おそらく、アプリで利用可能なアクションを抽象化し、元に戻す/やり直しで再構築することをお勧めします。基本的に、命令セットのスタックを作成しています。これにより、スタックが大きくなるほど遅くなりますが、メモリ内の画像が大きい場合は、これが唯一の方法かもしれません。