通常、アニメーションはアプリや Web サイトの視覚的な魅力を高め、ユーザーの全体的なエンゲージメントを向上させます。 Forrester Research の調査によると、適切に実行されたアニメーションを備えた Web サイトでは、ユーザー エンゲージメントが最大 400% 増加します。魅力的なアニメーションはユーザーの注意を引き、プラットフォームとの対話を促すことができます。ただし、特により高度なアニメーション ツールやテクニックを使用する場合、開発者がアニメーションを習得するには学習曲線が必要です。
アニメーションの経験がない開発者でも、他のアニメーション ツールやフレームワークに比べて、Rive を理解するのは比較的簡単です。 Rive (以前は Flare として知られていました) は、アニメーションの経験がほとんどまたはまったくない開発者でも、ユーザーフレンドリーでアクセスしやすいように設計されています。この記事では、シンプルで美しい Rive アニメーションを簡単に作成し、Flutter アプリで管理する方法を学びます。
Rive の紹介🧙♂️
シンプルなインタラクティブなログインアニメーション🚀
結論🏋️♀️
参考文献🧶
Rive は、強力でユーザーフレンドリーなアニメーション ツールおよびランタイム エンジンであり、開発者やデザイナーがモバイル アプリ、Web アプリケーション、ゲームなどのさまざまなプラットフォーム向けに魅力的でインタラクティブなアニメーションを作成できるようにします。
主要な概念は次のとおりです。
簡単なログイン アニメーションを作成し、それを Flutter アプリにエクスポートするプロセスを実行します。 StateMachine を使用して、アプリ内でのこのアニメーションの対話性を管理します。最終的にはこんな感じになるはずです👇🏽
Rive アートボードに要素を設定するには、以下の手順に従ってください。
次に骨を縛って重さを量ります。バインドにより、ボーンが動くと、それに応じてキャラクタのサーフェスの対応する部分が動き、変形しているかのような錯覚が生まれます。頂点の重み付けとも呼ばれる重み付けには、特定のボーンへの近接性に基づいてキャラクタのメッシュの各頂点に影響値 (重み) を割り当てることが含まれます。バインドするシェイプのパスに移動します。首の場合は、このようにして首の骨にバインドします。
ボーンをバインドした後、ウェイトを割り当てて頂点を設定します。ここで、2 つのボーンに 50% の効果を持たせたいため、最後の頂点セットに 50% を設定していることに注意してください。特に、設定された頂点が 2 つのボーンに影響するセクションをカバーする場合は、50% を使用する必要があります。ここで、髪の毛のパスについても同じことを行います。また、髪の毛に流れるような動きを実現するために、左右のボーンを 1 つから 2 つに変更します。
このアニメーションでは点滅効果を持たせたいと考えています。これを実現するには、次のように 2 つの目の形にクリップ機能を使用します 👇🏽
次に、アニメーション中に頭を動かしたいので、移動制約を使用してヘッド トラッキングをこの要素に追加します。これは 2D 要素であるため、移動制約を追加すると、奥行きと何らかの形の 3D 効果が与えられます。すべてを選択してグループ化します。これで 1 つのグループができました。
次に、左上隅でグループ ツールを選択し、頭の中心 (鼻の部分) にグループを作成します。右側のツールバーで、スタイルをグループからターゲットに変更し、 ctrl_frontという名前を付けて複製し、複製したものにctrl_back という名前を付けます。
ターゲット ctrl_back については、右側のツールバーから制約オプションを選択します。利用可能な制約オプションのリストから変換制約を選択します。選択した制約オプションの前のアイコンをクリックして、そのプロパティを設定します。
強度を -100 に設定し、ターゲットをCtrl Front に設定します。 Ctrl キーを前に動かすと、 Ctrl キーを後ろに動かすと反対方向に動きます。これは、耳など、反対方向に動く必要がある顔の部分に制約を設定するのに役立ちます。このように見えるはずです 👇🏽
次に、顔の残りの部分に制約を設定します。また、目 (左と右) と耳 (左と右) をグループ化して、より適切に管理できるようにします。こんな感じで目にコンストレイントを設定していきます👇🏽
グループ | 拘束強度 | 原点位置 | 目標 |
---|---|---|---|
眼鏡 | 5% | ctrl_front の原点と同じ | ctrl_front |
眉毛 | 10% | ctrl_front の原点と同じ | ctrl_front |
耳 | 5% | 原点を設定する必要はありません | ctrl_back |
鼻 | 5% | ctrl_front の原点と同じ | ctrl_front |
顔 | 5% | ctrl_front の原点と同じ | ctrl_front |
唇に制約を設定する必要はありません。
すべての制約を追加し終えた後の様子です 👇🏽
💃🏽 🥳 おめでとうございます。達成したい種類のアニメーションに対応する要素の準備が完了しました。ふぅ!!
右側のツールバーで「アニメーション」ボタンをクリックして、アニメーション インターフェイスに切り替えます。 6 つのアニメーション タイムラインを作成し、すべてをステート マシンと結び付けます。タイムラインでは、ボーンとコンストレイントで以前に設定したものを使用して、キーフレームを設定して、実現したいアニメーションを作成できます。
最初のタイムライン アニメーションはアイドル アニメーションです。アニメーションのIdle状態になります。アニメーション要素が関与していない場合にこれを使用します。
このアイドル アニメーションでは、呼吸、髪のわずかな動き、まばたきのイリュージョンを作成します。首のボーン、髪のボーン、右目/左目の要素を使用して、さまざまなポーズで必要なキーフレームを設定します。これは、タイムライン上のポイントで選択したアイテムの特定のプロパティを設定できることを意味します。あるキーフレームから次のキーフレームへの遷移スタイルを考慮して、必要な補間の種類を選択します。これは、「タイムライン」セクションの右下にあります。あるキーフレームから次のキーフレームにどのように移動するかに応じて、補間はホールド、リニア、またはカーブのいずれかになります。こんな感じになります👇🏽
上の GIF から、タイムライン上のさまざまなキーフレームで、選択したアイテムにさまざまなポーズを設定していることがわかります。あるキーフレームから別のキーフレームへのこの移行により、アニメーションが形成されます。これと同じ手順を使用して、他の 5 つのタイムラインを作成します。ここをクリックすると、このアニメーションが表示され、さまざまなタイムラインを詳しく確認できます。こんな感じです👇🏽
このアニメーションプロセスの最終部分に来ました。ステート マシンは、アニメーションを視覚的に接続する方法です。ステート マシンを使用すると、設定した入力に基づいてどのアニメーションを再生するかを制御できます。 2 つ以上のタイムライン アニメーションを混合またはブレンドして、同時に再生することができます。ステート マシンで適切な種類の入力を選択する必要があります。これは、アプリでアニメーションを制御するために使用するものだからです。
ステート マシンには 3 種類の入力があります。
[アニメーション] パネルで、プラス ボタンをクリックし、ステート マシンを作成します。これをLogin State Machineという名前にします。この名前は、コードの後半でステート マシンを識別するために必要になるため、重要です。
ステート マシンをセットアップするには、次の手順に従います。
これで、ステートマシンの完全なアニメーションは次のようになります 👇🏽
ここで完全なアニメーションとステート マシンを確認してください。
おめでとうございます 🥳、要素をアニメーション化し、ステート マシンで設定することに成功しました。ただし、rive ファイルをエクスポートする前に、背景とキャラクターのシャツの色を変更します。こんな感じになります👇🏽
背景色は(#B581EB)、キャラクターのシャツ色は(#BD08D7)です。
すべての詳細を確認するには、ここにアニメーションへのリンクがあります
このアニメーションをログイン ページで使用します。 Flutter アプリ プロジェクトを作成し、Rive 依存関係をpubspec.yaml
に追加します。
dependencies: rive: ^0.11.12
また、エクスポートした Rive ファイルをプロジェクト アセットに追加します。これで、デザインに基づいて UI の作成に進むことができます。アニメーションで次のことを行うことを目的としています。
Widget Build 関数の前に、まずいくつかのことを定義します。
///Login details String emailCred = "[email protected]"; String passwordCred = "123456"; /// input form controller FocusNode emailFocusNode = FocusNode(); TextEditingController emailCtr = TextEditingController(); FocusNode passwordFocusNode = FocusNode(); TextEditingController passwordCtr = TextEditingController(); /// rive controller and input values StateMachineController? controller; SMIInput<bool>? check; SMIInput<double>? look; SMIInput<bool>? success; SMIInput<bool>? fail; bool isLoading = false; bool isError = false; @override void initState() { emailFocusNode.addListener(emailFocus); passwordFocusNode.addListener(passwordFocus); super.initState(); } @override void dispose() { emailFocusNode.removeListener(emailFocus); passwordFocusNode.removeListener(passwordFocus); super.dispose(); } void emailFocus() { check?.change(emailFocusNode.hasFocus); } void passwordFocus() { check?.change(passwordFocusNode.hasFocus); }
ここで、次のことに注意してください。
emailFocus
関数とpasswordFocus
関数では、チェック入力はブール値FocusNode.hasFocus
に基づいて変更されます。initState
関数とdispose
関数で、リスナーが追加および削除されることがわかります。リスナーはフォーカスの変化を聞くために使用されます。
UI のコードと残りのコードはここで確認できます。このコードは、RiveAsset を追加する方法を示しています。
SizedBox( height: 250, width: 250, child: RiveAnimation.asset( "assets/login_screen.riv", fit: BoxFit.fitHeight, stateMachines: const ["Login State Machine"], onInit: (artboard) { controller = StateMachineController.fromArtboard( artboard, "Login State Machine", ); if (controller == null) return; artboard.addController(controller!); check = controller?.findInput("check"); look = controller?.findInput("look"); success = controller?.findInput("success"); fail = controller?.findInput("fail"); }, ), ),
上記のコードから、次のことがわかります。
ログイン関数のコードは次のとおりです。
void login()async{ //extract the text coming from the text fields final email = emailCtr.text; final password = passwordCtr.text; //Set loading boolean to true and delay to give an illusion of loading setState(() { isLoading = true; }); await Future.delayed( const Duration(milliseconds: 2000), ); // check if details entered is the same as the correct creditials defined if (email == emailCred && password == passwordCred) { //if correct trigger the success input and set error boolean to false success?.change(true); setState(() { isError = false; }); if(context.mounted){ // delay and navigate to home screen await Future.delayed( const Duration(seconds: 2),(){ Navigator.push(context, MaterialPageRoute(builder: (context) =>const HomeScreen())); }); } } else { // if details don't match defined credentials // set error boolean to true and trigger the fail input // set loading boolean to false setState(() { isError = true; }); fail?.change(true); } setState(() { isLoading = false; }); }
完全なコードはここで確認してください。
これにより、ログイン アニメーション コードが完成しました。すべては次のようになります。
おめでとう!このシンプルなインタラクティブなログイン アニメーションが完成しました。私たちが達成できたすべての概要は次のとおりです。
このチュートリアルを段階的に実行すると、いくつかのボトルネックに直面する可能性がありますが、練習すれば簡単になるでしょう。このチュートリアルを進める際にサポートが必要な場合は、 Twitterで私に連絡するか、コメントしてください。
Rive アニメーションをよりよく理解するには、これらのビデオ チュートリアルをチェックしてください。
Rive チャンネルでは、 Rive アニメーションに関するいくつかのビデオ チュートリアルをチェックすることもできます。
ここでも公開されています。