複雑なUIインタラクションアニメーションの設計と実装にどのようにアプローチしますか?
(私が興味を持っている相互依存アニメーションの管理について特定の考え方を強いられない限り、jQueryやUIKitのような特定の言語やライブラリについては話していません。)
iOSホーム画面の設計やプログラミングのような一見「単純な」タスクを考えてみましょう。
ただし、隠れた複雑さの大きさは驚くべきものです。
インターフェイスについて気付いたことがいくつかあります。
- アイコンにかろうじて触れると、不透明度は変わりますが、サイズの変更は遅れます。
- 他の2つのアプリ間でアプリをドラッグすると、すべてのアプリが再配置されて空き領域が移動するまでに、顕著な遅延が発生します。そのため、画面上でアプリを動かし続けると、落ち着くまで何も起こりません。
- 再配置は行ごとに行われ、最初にホバーした行に移動し、チェーン内の次の行をトリガーして、以前は空き領域があった行に移動します。
- アプリをドロップすると、ドロップした場所だけでなく、現在は空きスペースにドロップされます。
- アプリを別のアプリの上に置くと、放射状のライトが表示され、2回点滅してから、グループが作成されます。
- グループが空き領域の右側に作成されてから破棄された場合、グループは左側をアニメーション化して、破棄中に空き領域を占有します。
ここでは、気付かなかった複雑さがさらに増していると確信しています。
連続アニメーションと離散アクション
大まかに一般化すると(animation, user_action)
、同じインターフェイスコンテキスト内のの各ペアについて、がすでに実行されているときに何user_action
が発生animation
するかを決定する必要があります。
ほとんどの場合、
- アニメーションをキャンセルします。
- 外出先でアニメーションを変更します。
- アクションを無視します。
- アニメーションが終了するまでアクションをキューに入れます。
ただし、アニメーション中にいくつかのアクションが発生する可能性があり、アニメーションが終了したときに、破棄するアクション、キューに入れるアクション、およびキューに入れられたすべてのアクションを実行するか、最後のアクションのみを実行するかを決定する必要があります。
アニメーションの終了時に何かがキューに入れられ、アニメーションが変更された場合、キューに入れられたアクションがまだ意味があるかどうか、または削除する必要があるかどうかを判断する必要があります。
これが理論的すぎると思われる場合は、実際の例を考えてみてください。ユーザーがアプリを下にドラッグし、再配置が開始されるのを待ってから、すぐにアプリを上にドラッグして放すとどうなりますか?考えられるすべてのケースで、アニメーションがスムーズで信頼できるものであることをどのように確認しますか?
仕事に適したツール
考えられるシナリオの半分でも頭の中で維持することができないことに気づきました。UIの表現力が高まるにつれて、可能な状態の数は7±2のルールに激しく違反し始めます。
したがって、私の質問は次のとおりです。
アニメーションの設計と実装の複雑さをどのように抑えますか?
私は問題についての効果的な考え方とそれを解決する手段の両方を見つけることに興味があります。
例として、イベントとオブザーバーは、ほとんどのUIにとって非常に効果的な抽象化であることが証明されました。
しかし、主な抽象化としてイベントに依存するiOSのようなドラッグアンドドロップ画面を設計および実装できますか?
UIのすべての可能な状態を正確に表すには、コードがどの程度絡み合っている必要がありますか?さらに別のイベントハンドラーがその前に実行されていない限り、ブール変数がfalseに設定される関数にtrueの場合、別のイベントハンドラーを追加するのはイベントハンドラーでしょうか?
「クラスのことを聞いたことがありませんか?」あなたは不思議に思うかもしれません。なぜ、私は持っていますが、これらのクラスが共有したいと思う状態が多すぎます。
要約すると、私は、シーケンスまたは一度に発生する複雑な相互依存のキャンセル可能なアニメーションを管理し、それらがユーザーのアクションにどのように反応するかを説明するための、言語に依存しない(おそらく言語またはフレームワークに触発された)手法を探しています。
(アニメーション自体をプログラムする必要がないことを考えると、これはすべてです。つまり、jQueryやCore Animationanimate(styles, callback)
のような、自分に合ったフレームワークにアクセスできcancel
ます。)
データ構造、デザインパターン、DSLは、問題の解決に役立つのであれば、すべて優れています。