重複するUIアクションとアニメーションを処理するためのデザインパターンはありますか?いくつかの例:
新しいアクションが実行されたときに、UI要素のすべてのアニメーションを自動的に早送りしたり、すべてのアニメーションUI要素でユーザー入力をブロックしたりできます。しかし、それは私にはエレガントではないようです。ユーザーとして、私は自分がやりたいことを妨げたり妨げたりしないUI、つまり実際のオブジェクトのように動作するUIを本当に尊敬しています。また、自分のアプリケーションでも同じことをしたいと思っています。
これを堅牢なシステムにするためには、アクション/アニメーションごとに制約を設ける必要があるようです。たとえば、データ/状態/モデルへの変更が発生する前にではなく、アニメーションへのコールバックでonlyが発生することを確認する必要がある場合があります。例2では、ユーザーがボタンをクリックして最後の行を削除するとすぐに、モデル内のグループを削除することはできません。アニメーションの最後に、アニメーションの最後にのみ行う必要があります。 (そうでない場合、ユーザーがアニメーションの削除中に別の行を追加することを決定した場合、グループの削除を元に戻すことは非常に困難です。)また、2つの異なるアクションからの2つのアニメーションが重なる場合に、相互に排他的なプロパティは、以前と同じようにアニメーションを継続します。 (つまり、行がクリックで拡大しているときにユーザーがテーブルをソートした場合、行が新しい位置に移動しているからといって、幅の拡大が止まってはなりません。)そして、各アニメーションのデフォルトの開始はどうでしょうか?行が削除されたときにフェードアウトし、別のアクションが暗黙的に削除をキャンセルした場合、他のアクションが必ずしもそれを認識していなくても、フェードアウトは停止してアニメーションで戻ります。
また、アニメーション(視覚的なプロパティの変更)とアクション(アニメーションを含む、潜在的なモデルの変更を伴うイベントのシーケンス)の上位レベルの問題もあります。例2では、「最後の行を削除」は明らかにアクションです。これは、最終的にグループが削除されるためです。ただし、ほとんどのUIライブラリでは、アニメーションにコールバックを追加して、2つを混同します。これもゲームの問題です。キャラクターのスローアニメーションが終了した後に手榴弾スローをトリガーする必要がある場合、コードでそれをどのように表現しますか?モデルとビューコードを混在させずに、外部要因に基づいてアニメーションの速度を遅くしたり速くしたりしながら、手榴弾をタイムラインに配置するにはどうすればよいですか?
これについて考えれば考えるほど、頭が痛くなり、誰かが私よりもずっと慎重にこれを考えてきたと確信しています。何か案は?
(現時点では、主にWeb UIのこれに興味がありますが、将来の非Webプロジェクトの一般的なアプローチにも興味があります。)
Rucamzuが言及デコレータパターンが適合しているようです。 visitorパターンは、アニメーションを実行するオブジェクトがDOM要素のプロパティ/スタイリングを更新するためにアニメーションの過程全体でDOM要素に複数回アクセスするため、適合する場合があるようです視覚的な変化。
同時/連続非同期操作キューイングを特徴とするライブラリがいくつかあります。 (プログラミングしているターゲットクライアントで)通常探すものには、次のものが含まれます。
私が検討できるライブラリがいくつかあります。
選択はおそらく、アニメーションの強度と、サポートする必要のあるブラウザとデバイスに基づいて行われます。
あなたはおそらくフラッシュプロジェクトを構築していませんが、彼らは当時の複雑なアニメーションで知られていました。上記の上位2つのアイテムは、フラッシュの世界にルーツがあるため、数年以上前から存在しています。 Greensockのライブラリを使用して、ほぼすべてのフラッシュプロジェクトを6年間実装しました。彼のドキュメントはしっかりしていて、例もたくさんあります: Greensock JS入門 。
animationsを、それらの対話機能に影響を与えずに、テーブルの行にアタッチする必要があります。 デコレータ ここに収まります:ユーザーインタラクションイベントを装飾されたオブジェクトに転送しながら、アニメーションを管理します。ここではアニメーション自体は重要ではなく、デコレータオブジェクトの(単なる)パラメータであれば十分です(したがって、同じデコレータクラスを任意のアニメーションで再利用できます)。また、この方法では、デコレータをネストするだけで、同じ行で任意の数のアニメーションを同時にアクティブにすることができます。視覚的な結果は別の話です:)
しかし、一歩下がって全体像を探すと、ユーザーインターフェイスの観点から見ても、アニメーションは詳細だけです-多かれ少なかれ対処するのが難しい場合優れたユーザーエクスペリエンスを提供するために、そして間違いなく非常に関連性があります。しかし、それらは焦点ではありません。一般的なスキームは次のようになります。