こんにちは。 pregum_foxです。
雑談
今週は来週の日曜日に開催される技術書典を楽しみにしながら、生活しています。
いわゆる技術系の即売会ですが、マネジメント系から低レベルの技術(ベアメタル等)まで豊富にあって、新しい技術や面白い技術ないかなと思っている人にはうってつけなイベントだと思います。
興味のある方はぜひ足を運んでみてはいかがでしょうか。
本題
今回はFlutterのAnimationを触ってみました。
できたものはこんな感じです。
これを作成するまでに躓いたこと等を書いていきます。
それでは、目次です。
動作環境
項目 | バージョン |
---|---|
Dart | 2.5.0 |
Flutter | 1.9.1+hotfix.2 |
PS C:\xxxxx\xxxx\Source\Repos\Flutter\animate_widget_using_a_physic_simulation> flutter doctor --version Flutter 1.9.1+hotfix.2 • channel stable • https://github.com/flutter/flutter.git Framework • revision 2d2a1ffec9 (12 days ago) • 2019-09-06 18:39:49 -0700 Engine • revision b863200c37 Tools • Dart 2.5.0
やりたかったこと
プチコンの以下のサイトにあるSYS/EX6SEQUENCERのプログラムを再現してみようとしてみました。
プログラムリスト SYS/EX6SEQUENCER – SmileBasic
完成はしていませんが、シーケンスが動く所はできました。
使用したソースは下のgistに配置しました。
300行ちょっとのソースコードですが、半分以上がWidget作成用のコードです。
順を追って説明します。
処理の流れ
SingleTickerProviderStateMixinの実装
AnimationControllerを使用する為に実装しています。
今回はAnimationControllerは1つしか使用しないので、SingleTickerProviderStateMixinを実装しています。
もし2つ以上AnimationControllerを使用する場合は、TickerProviderStateMixinを実装します。AnimationControllerのインスタンスを作成
AnimationControllerをinitState()で作成します。
Durationはスライダーの値によって変化させるのでフィールド_valueを指定しています。Animation<T>のインスタンスを作成
Animation<T>のTが実際にWidgetに渡される型です。
ここではAnimation<int>のインスタンスを作成しています。AnimatedBuilderを使用してAnimation対応Widgetを作成 Animationに対応する方法は様々な方法があるみたいですが、ここでは簡単なAnimatedBuilderを使用しています。
FloatingActionButtonをtapしてアニメーション開始します。 何度も繰り返しアニメーションを行いたい為、repeat()を使用しています。
アプリ終了時、disposeを行います。
詰まった所
Widgetの強調アニメーション時、他のWidgetが被って見た目が悪くなった
Table版その2ではTransform.scale()を使用して、Containerのscaleを大きく表示させた所、右側のWidgetに被ってしまい、見栄えが悪くなってしまいました。
原因としては、Widgetのz indexは記述順に上に追加されていく(最後のWidgetが手前に来る)為でです。
対処としては、Stack版で行っているように、強調するWidgetを最後に追加するようにすればscaleが大きくなっても他のWidgetが被らないようになります。(Tableは、追加した順に表示される為実質不可能)
Animationの値が小数でしか受け取れない
各Widgetのindexをアニメーションの値から取得する方法が、Tween
試してみたいこと
Animationのaddlistener()やaddStatusListener()等は今回使用していないので、次回いいネタがあったら試してみたいです。
雑感
最初はとっつきにくかったですが、ある程度書き方がわかると、表現の幅が広がって良いと思いました。
ただ、Animationに凝り過ぎて実行速度が遅くなるという本末転倒な事態にならないようにしたいと思います。
ここまで読んで頂き、ありがとうございました。