SlideShare a Scribd company logo
1 of 80
Download to read offline
明示的なアニメーションで
Flutterアニメーション入門
1
IWD 2020 Women Techmakers
Flutter Meetup Osaka #3
自己紹介
名前
robo (兼高理恵)
好きなもの
モバイル端末
おしごと
アプリの設計から実装まで
所属
GDG Kyoto (staff) WTM Kyoto (staff) Flutter Osaka (staff)
2
はじめに
公式資料は、アニメーションの概要紹介から、
基盤クラスや応用法…etc の しっかりとした資料です。
説明では、クラス名や用語に英語圏の概念名称を使い、
クラスアーキテクチャの説明から始まっています。
少し硬派な印象…のため、
とっつきやすいよう
Flutter in Focus の Animations 編を参考に、
明示的や暗黙的なアニメーションの説明と具体的な使い方を紹介します。
3
抽象化しすぎて派生クラス責務が
多義化しているのか私的混乱中…
アニメーションの大別
How to Choose Which Flutter Animation Widget is Right for You? より、
アニメーションを大別すると、
主に描画ベースとコードベースの2種類に別れます。
● 描画ベース(drawing-based)のアニメーションは、
Canvas に描画する線や画像のパラメータを変化させて再描画することで、
アニメーションを表現します。
● コードベース(code-based)のアニメーションは、
特定のウィジェットのプロパティ値を変化させて再描画することで、
外観や遷移のアニメーションを表現します。
4
描画ベースのアニメーション
CustomPaint ウイジェットと CustomPainter を使い、
CustomPainter#paint(Canvas, Size) メソッド内での描画…
Canvas に描画する線や画像のパラメータ値を変化させて、
連続して再描画することで、アニメーションを表現します。
パラメータ値は、後述の 明示的アニメーション 方式をベースにして、
AnimationController と Tween や Cureve を使った手法で変化させます。
https://api.flutter.dev/flutter/widgets/CustomPaint-class.html
https://api.flutter.dev/flutter/rendering/CustomPainter-class.html
https://api.flutter.dev/flutter/dart-ui/Canvas-class.html
5
コードベースのアニメーション
コードベースのアニメーションには、
明示的と 暗黙的の 2種類の実装形式があります。
明示も暗黙もウィジェットのプロパティ値を変化させて、
連続して再描画することで、アニメーションを表現します。
明示的 (Explicit) と 暗黙的 (Implicit) の違いは、
明示的にアニメーションの実行や同期管理が必要なのか、
何もしなくてもすむ(暗黙実行される)かを表しています。
6
Explicit 明示的 なアニメーション
7
Explicit 明示的なアニメーション
 アニメーションの再生や停止、繰返逆転再生などの
 アニメ実行操作や、複数のアニメを同期実行させるなど、
 一般的に AnimationController で、
 アニメの実行や同期管理が必要な実装形式です。
 ウィジェットのプロパティ値を変化させながら、
 連続して再描画させてアニメーションを表現するために、
 AnimationControllerの他に Tween や Animation#value や、
 AnimatedWidget と AnimatedBuilder ウィジェットを利用します。
 ※変化演出のために CurvedAnimation と Curve も使います。
8
Explicit 明示的なアニメーション (実装概要)
1. Ticker (アニメーションフレームのハンドラ)を取得できるようにします。
2. AnimatedBuilder などでアニメ中に連続して再描画されるようにします。
3. AnimationController を vsync と duration を指定して生成します。
     vsync で Ticker 提供元、duration でアニメ継続時間を指定します。
4. Tween に変化させるプロパティ型の 初期値 と 終了値 を設定して、
5. 変化するプロパティ値を提供する Animation オブジェクトを生成し、
6. その値(Animation#value)をウィジェットのプロパティ値に適用します。
7. アニメを実行します。
  アニメ継続時間中は、クロック/進捗率に従ってプロパティ値が変化し、
  フレームごとにウィジェットが再描画されることでアニメが表現されます。
9
Explicit 明示的なアニメーション (用語説明)
・フレームは、アニメーションにおける映画フィルムでの1コマを表す概念
 スマフォなら 60fps〜120fps
・Ticker は、アニメーションフレームのハンドラです。
 アニメーション・フレームごとに 指定関数を呼び出し、
 内部的には、フレームごとの連続した描画(実態は setState() 実行)に使われます。
・クロック / 進捗率 は、アニメの進捗状況を 0.0〜1.0 で表す概念(独自造語)
 アニメ開始時は 0.0 で、アニメ終了時(アニメ継続時間に到達時 )に 1.0 になります。
 その実態は、AnimationController における Animation#vaue 値です。
・Tween は、アニメ進捗率と 初期値 / 終了値 とのマッパーです。
 アニメ進捗率の 0.0 と 1.0 に 初期値 と 終了値 が対応するようにして、
 変化するプロパティ値が、描画時のアニメ進捗率に対応するようにします。
10
Explicit 明示的なアニメーション (用語説明)
・変化するプロパティ値を提供する Animation オブジェクトとは、
 Tween#animate(animation) で返される Animation オブジェクトです。
 変化するプロパティ値の実態は、Tween から生成した Animation#vaue 値です。
・アニメの実行とは、AnimationController の forward メソッドなどの実行です。
 他に stop や reset などもあり、repeat(reverse:true) で折返再生もできます。
・CurvedAnimation で AnimationController をラップすれば、
 クロック / アニメ進捗率 の進行を 任意非線形することもできます。
 具体的には、CurvedAnimation の parent に AnimationController を、
 curve に Curve派生物 を指定すれば、クロックが非線形進行に変換され、
 結果的に プロパティ値の変化に 加速度変化を与える ようなこと もできます。
  Tween は、クロック / アニメ進捗率に触れず、プロパティ値の変化に重み付けを与えるのに対し、
  Curve は、クロック / アニメ進捗率の変化に重みをつけることで、プロパティ値に重みを与えます。 11
Explicit 明示的なアニメーション (実装手段)
 
12
明示的アニメの実装手段は 4種類あります。
・基盤ウィジェットベース
 AnimatedBuilder
 AnimatedWidget
・組込済ウィジェットベース
 XXX Transition
・描画ベース
 CustomPainter (本稿では扱いません)
How to choose which Flutter Animation Widget is right for you? - Flutter in Focus
https://www.youtube.com/watch?v=GXIJJkq_H8g&feature=youtu.be&t=316
Flutter in Focus より
明示的 なアニメ(AnimatedBuilder版)
13
Explicit 明示的なアニメ (AnimatedBuilder)
14
AnimatedBuilder リファレンスには、
Interactive App というブラウザ上で
動作を確認できるサンプルコードが
 紹介されています。
 このコードサンプルを基に、
 Tween 関係のコードを少々加えて
 明示的アニメの基本的な実装手順を
 紹介します。
AnimatedBuilder class
https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html
Explicit 明示的なアニメ実装例
15
import 'package:flutter/material.dart';
import 'dart:math' as math;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: MyStatefulWidget(),
);
}
} このページの実装は、
特に明示的アニメとは関係ありません。
Explicit 明示的なアニメ実装例
16
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({Key key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget>
with TickerProviderStateMixin {
AnimationController _controller;
Animation<double> _angleAnimation;
⑤ 変化するプロパティ値を提供する
  Animation オブジェクトのフィールドを宣言
① TickerProviderStateMixinをミキシインして、
  ウィジェットに TickerProviderを継承させる。
   ウィジェットが Ticker を提供できるようにします。
水色の項目は、独自に追加した行です。
緑色の項目は、独自に変更した行です。
Explicit 明示的なアニメ実装例
17
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 10),
vsync: this,
)..repeat();
_angleAnimation = Tween(begin: 0.0, end: 2.0).animate(_controller);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
③ AnimationController は、initStateで初期化
 duration は、アニメーション継続時間
 vsync は、Ticker 提供元になります。
⑦ アニメを繰返実行
  (無限ループ)させる。
④ Tween に変化させるプロパティ型の
  初期値 と 終了値 を設定します。
 AnimationController は、
 使い終わったら必ず
 dispose() してください。
⑤ 変化するプロパティ値を提供する
  Animation オブジェクトを生成します。
 クロック/アニメ進捗率を
 提供するAnimation オブジェクト
18
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
child: Container(
width: 200.0,
height: 200.0,
color: Colors.green,
child: const Center(
child: Text('Whee!'),
),
),
builder: (BuildContext context, Widget child) {
return Transform.rotate(
angle: _angleAnimation.value * math.pi,
child: child,
);
},
);
}
}
⑥ 変化するプロパティ値を提供する
  Animation オブジェクトのアニメーションプロパティ値を
  ウィジェットのプロパティに適用します。
  初期値 と 終了値 が アニメ進捗率 0.0 と 1.0 に対応するように
  マッピングされるので、現在のアニメ進捗率に合わせた値が返ります。
② AnimatedBuilder ウィジェットの builder 関数は、
  アニメ継続時間中はフレームごとにコールされます。
  ウィジェットは、連続して再描画されることになります。
Explicit 明示的なアニメ実装例 (差異)
19
builder: (BuildContext context, Widget child) {
return Transform.rotate(
angle: _controller.value * 2.0 * math.pi,
child: child,
);
},
builder: (BuildContext context, Widget child) {
return Transform.rotate(
angle: _angleAnimation.value * math.pi,
child: child,
);
},
オリジナル行では、
AnimationController のクロック値
⇒ アニメ進捗率 (0.0〜1.0)をそのまま使っていたので、
2π ⇒ 360度になるよう 2.0 を掛ける必要がありました。
改修版では、
Tweenで値の範囲を 0.0〜2.0 にしたので、
2.0 を掛ける必要がなくなっています。
明示的 なアニメ(AnimatedWidget版)
20
Explicit 明示的なアニメ(AnimatedWidget)
21
AnimatedWidget リファレンスにも、
Interactive App のサンプルコードが
 紹介されています。
 アニメ中に連続して再描画されるよう
 継承ウィジェットを作ること② を除き、
 AnimatedBuilder での明示的なアニメ実装
 と本質的な違いはありません。
詳しくはサンプルコードを確認ください。
AnimatedWidget class
https://api.flutter.dev/flutter/widgets/AnimatedWidget-class.html
Explicit 明示的なアニメ(AnimatedWidget)
22
class SpinningContainer extends AnimatedWidget {
const SpinningContainer({Key key, AnimationController controller})
: super(key: key, listenable: controller);
Animation<double> get _progress => listenable;
@override
Widget build(BuildContext context) {
return Transform.rotate(
angle: _progress.value * 2.0 * math.pi,
child: Container(width: 200.0, height: 200.0, color: Colors.green),
);
}
}
② AnimatedWidget 継承ウィジェットの build() は、
  アニメ継続時間中はフレームごとにコールされます。
  ウィジェットは、連続して再描画されることになります。
AnimatedWidget 継承ウィジェットには、
生成引数に AnimationController が必用
Explicit 明示的なアニメ(AnimatedWidget)
23
class _MyStatefulWidgetState extends State<MyStatefulWidget>
with TickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 10),
vsync: this,
)..repeat();
}
 AnimatedWidget 継承ウィジェットに渡される AnimationController は、
 別のウィジェットで生成しています。
① TickerProviderStateMixinをミキシインして、
  ウィジェットに TickerProviderを継承させる。
   ウィジェットが Ticker を提供できるようにします。
③ AnimationController は、initStateで初期化
 duration は、アニメーション継続時間
 vsync は、Ticker 提供元になります。
明示的 なアニメ(XXX Transition版)
24
Explicit 明示的なアニメ (XXX Transition)
25
SlideTransition リファレンスにも、
Interactive App のサンプルコードが
 紹介されています。
XXX Transition で命名されたウィジェットは、
AnimatedWidget や AnimatedBuilder が不要な、
明示的アニメーション対応のウィジェットです。
他にも FadeTransition、RotationTransition、
PositionedTransition、DecoratedBoxTransition、
ScaleTransition、AlignTransition…があります。
SlideTransition class
https://api.flutter.dev/flutter/widgets/SlideTransition-class.html
Explicit 明示的なアニメ (XXX Transition)
26
AnimationController _controller;
Animation<Offset> _offsetAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true);
_offsetAnimation = Tween<Offset>(
begin: Offset.zero,
end: const Offset(1.5, 0.0),
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.elasticIn,
));
}
@override
Widget build(BuildContext context) {
return SlideTransition(
position: _offsetAnimation,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: FlutterLogo(size: 150.0),
),
);
}
XXX Transition で命名されたウィジェットは、
④ ウィジェットのプロパティ値を変化させるため、
⑤ AnimationController と Tween を利用しますが、
② ウィジェット自体で、連続した再描画が行えるため、
  AnimatedWidget や AnimatedBuilder 利用は不要です。
⑥ プロパティも Animation オブジェクト対応なため、
  そのまま適用 (Animation#value 記述不要)できます。
Explicit 明示的なアニメ (XXX Transition)
27
AnimationController _controller;
Animation<Offset> _offsetAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true);
_offsetAnimation = Tween<Offset>(
begin: Offset.zero,
end: const Offset(1.5, 0.0),
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.elasticIn,
));
}
スライドの動きがアニメ終盤に急激に振幅するよう、
CurvedAnimation で AnimationController をラップして、
アニメ進捗率の進行 (等速変化)を curve で指定した
非線形の Curves.elasticIn に変換しています。
【補足】
 SlideTransition のサンプルコードでは、
 プロパティ値の変化に急激な動きの演出も
              入れています。
Implicit 暗黙的 なアニメーション
28
Implicit 暗黙的なアニメーション
 暗黙的なアニメーションは、
 AnimationController が不要で、ウィジェット描画で、
 何もしなくてもアニメが実行されるアニメーションです。
 (暗黙的に描画を契機にアニメ実行や同期管理がなされます)
 ウィジェット自身がアニメ対応しているので、
 duration 引数で アニメ継続時間 や、
 curve 引数で アニメ進捗率の非線形変換 (変化演出) が指定でき、
 アニメ対応プロパティ値を 現在値 から 指定値 まで変化させながら、
 連続して自身を再描画させて外観や遷移のアニメを表現します 29
Implicit 暗黙的なアニメーション (実装手段)
 
30
暗黙的アニメの実装手段は 2種類あります。
・組込済ウィジェットベース
 Animated XXX
・Tween組込済ウィジェットベース
 TweenAnimationBuilder
How to choose which Flutter Animation Widget is right for you? - Flutter in Focus
https://www.youtube.com/watch?v=GXIJJkq_H8g&feature=youtu.be&t=264
Flutter in Focus より
暗黙的 なアニメ(Animated XXX版)
31
Implicit 暗黙的なアニメ (AnimatedContainer)
32
AnimatedContainer リファレンスには、
Interactive App というブラウザ上で
動作を確認できるサンプルコードが
 紹介されています。
 このサンプルコードを基に、
 明示的アニメの実装を紹介します。
AnimatedContainer class
https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
Implicit 暗黙的なアニメ実装例
33
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(title: const Text(_title)),
body: MyStatefulWidget(),
),
);
}
}
このページの実装は、
特に暗黙的アニメとは関係ありません。
Implicit 暗黙的なアニメ実装例
34
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({Key key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
bool selected = false;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
setState(() {
selected = !selected;
});
},
このページの実装は、
特に暗黙的アニメとは関係ありません。
Implicit 暗黙的なアニメ実装例
35
child: Center(
child: AnimatedContainer(
width: selected ? 200.0 : 100.0,
height: selected ? 100.0 : 200.0,
color: selected ? Colors.red : Colors.blue,
alignment:
selected ? Alignment.center : AlignmentDirectional.topCenter,
duration: Duration(seconds: 2),
curve: Curves.fastOutSlowIn,
child: FlutterLogo(size: 75),
),
),
);
}
}
AnimatedContainer ウィジェットは、
アニメ継続時間中はフレームごとにコールされ
自身ウィジェットを、連続して再描画させます。
duration でアニメ継続時間を 2秒に指定
curve でアニメ進行率の変化演出を
初めは早くて後は遅くに指定しています。
     (Curves.fastOutSlowIn )
アニメ対応プロパティ値は、
再描画時に現在値から指定値まで
プロパティ値が変化していきます。
alignment を例にすれば、
初期表示はtopCenterなので、
タッチでtopCenter⇒centerになり、
次のタッチでは、center⇒topCenterに
      変化することになります。
Implicit 暗黙的なアニメ (Animated XXX)
36
Animated XXX で命名されたウィジェットは、
AnimatedContainer と同じように、
暗黙的アニメーション対応のウィジェットです。
他にも AnimatedAlign、AnimatedCrossFade、
AnimatedOpacity、AnimatedPhysicalModel、
AnimatedPadding、AnimatedPositioned、
AnimatedPositionedDirectional…があります。
Fade a widget in and out
https://flutter.dev/docs/cookbook/animation/opacity-animation
暗黙的 なアニメ(TweenAnimationBuilder版)
37
Implicit 暗黙的なアニメ(TweenAnimationBuilder)
38
TweenAnimationBuilder ウィジェットは、
任意のウィジェットの特定プロパティを変化させる、
暗黙的アニメーション対応のウィジェットです。
 変化させるプロパティの初期値と終了値(tween)と、
 アニメーション時間(duration)と、
 変化させるプロパティを引数に持った
 Buildr関数(builder)を指定するだけで利用できます。
 詳しくはサンプルコードを確認ください。
TweenAnimationBuilder class
https://api.flutter.dev/flutter/widgets/TweenAnimationBuilder-class.html
Implicit 暗黙的なアニメ (TweenAnimationBuilder)
39
Widget build(BuildContext context) {
return TweenAnimationBuilder(
tween: Tween<double>(begin: 0, end: targetValue),
duration: Duration(seconds: 1),
builder: (BuildContext context, double size, Widget child) {
return IconButton(
iconSize: size,
color: Colors.blue,
icon: child,
onPressed: () {
setState(() {
targetValue = targetValue == 24.0 ? 48.0 : 24.0;
});
},
);
},
child: Icon(Icons.aspect_ratio),
);
}
子ウィジェットの Icon は単独なので、
ウィジェットツリーには含まれますが、
ここでの描画はないことに留意!
tween で 初期値 と 終了値 を指定した、
アニメーション中に変化するプロパティ値 は、
ウィジェット描画を契機に、アニメ実行期間中、
変化しながら builder 引数の size に提供され続けます。
定義時に初期値 24.0 が設定済
コーヒー・ブレイク
「明示的なアニメーションを使えば、
 暗黙的アニメーション対応のウィジェットと同じようなこともできるかも?」
…そう思われた方はいませんか。
これまで見てきたことを応用して
AnimatedContainer サンプルのアニメーションを
Container ウィジェット + 明示的アニメーションで、
シミュレートしてみました。 
40
コーヒー・ブレイク
41
AnimatedContainer class
https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
https://dartpad.dev/embed-flutter.html?id=59814bb65a3ce5ca9d5d5218334624c9&split=70&theme=dark
Simulated sample of AnimatedContainer
ブラウザ上でアニメを動かして、
  コードを確認してくださいね。
コーヒー・ブレイク
 Flutter in Focus - Animations のブログ記事には、
 アニメーションの基礎についての投稿があります。
 よろしければ、御一読されてはいかがでしょうか。
      スライド後ろの【資料室】にリンク集をまとめました。
 右の例は、ビーム放射が拡大していくアニメーションを
 Container ウィジェット(BoxDecoration の RadialGradient)で
 円形グラデーションを描き、オリジナルのBeamClipper() で、
 子ウイジェット(Container)を扇型状にくり抜いて描いています。
42
When should I useAnimatedBuilder or AnimatedWidget?
https://medium.com/flutter/when-should-i-useanimatedbuilder-or-animatedwidget-57ecae0959e8
Explicit 明示的 なアニメーション
応用編
43
Staggered animations とは
Staggered pattern とは、
右図のようなタイル模様のことで、
  ずらした配置の意だそうです。
Staggered animations とは、
「Aパートの後で、Bパートを実行させる」…のように、
複数のアニメーション・パートを 時間をずらして配置して、
1つながりにする手法、 時間差実行アニメーション を示します。
例えば放物線ジャンプなら、上昇パートの後に落下パートを配置して1つながりにします。
44
Staggered animations / 時間差実行アニメーション
Staggered animations ドキュメント(公式)
には、
アニメーション・パートごとの複数のアニメーションを
時間差で実行させていくことで、1つのアニメにする
   時間差実行アニメの実装手法例 が紹介されています。 
45
Docs > Development > UI > Animations > taggered
Staggered animations
https://flutter.dev/docs/development/ui/animations/staggered-animations
Staggered animations ドキュメント・キーポイント
1. Staggered animations は、時間差実行アニメーション
アニメーション・パートごとの複数の Animation オブジェクトを
時間差で実行させていくことで、1つのアニメーションとする手法です。
2. AnimatedBuilder などでアニメ中に連続して再描画されるようにします。
3. Tween オブジェクトを
アニメーション化するパートかつ、プロパティごとに設定します。
4. アニメーションパートごとに調歩をとった時間差描画ができるよう、
アニメする進捗率の区間が限定される Animationオブジェクトを生成して、
変化させるプロパティごとに適用させます。
5. 1つの AnimationController オブジェクト で、
すべての Animationオブジェクト を制御します。
46
Staggered animations (実装手段)
 時間差実行アニメのキーとなる、
 アニメする進捗率の区間が限定される
 パートごとの Animationオブジェクトの生成手段を
                 2種類紹介します。
● Curve Interval ベース
アニメーション・パートごとに、
アニメ開始と アニメ終了の進捗率区間を 直接指定します。
● TweenSequence ベース
アニメーション・パートごとに、アニメ実行区間の重みをつけ、
全体を順序付按分して、アニメ開始と終了の進捗率区間を設定します。
47
時間差実行アニメ(Curve Interval 版)
48
Staggered animations by curve Interval
 Staggered animations ドキュメントでは、
 項目 ④ Animation オブジェクトごとに時間差で描画/適用されるようにする
 …ために、
 CurvedAnimation の curve に Interval という、
 指定区間のアニメ進捗率のときだけプロパティ変化を行なう
 Curve派生クラスで、指定区間専用の Animation オブジェクト を生成し、
 変化させるプロパティへの適用も、区間ごとに 指定区間専用 に切り替えて、
時間差で描画/適用されるようにしています。
 時間差実行アニメの実装自体は、     
 明示的なアニメーションの実装手法と基本的に同じです。
49
 Interval class
 https://api.flutter.dev/flutter/animation/Interval-class.html
時間差実行アニメサンプル (Curve Interval 版)
50
Interval を使った時間差実行アニメの
放物線ジャンプ・サンプルコード
放物線ジャンプの 上昇パート と 落下パート を
CurevedAnimation と curve Interval を使って、
時間差実行させるサンプルコードを作りました。
このサンプルコードを基に、
明示的アニメの応用実装を紹介します。
Staggered animations by Interval Curve
https://dartpad.dev/embed-flutter.html?id=059f3a7b9055963b51e6fe5afe756011&split=70&theme=dark
時間差実行アニメ (Curve Interval 版)
51
AnimationController _controller;
Animation<double> _yAnimationIn;
Animation<double> _yAnimationOut;
Animation<double> get _yAnimation => (_controller.value <= 0.5)
? _yAnimationIn : _yAnimationOut;
放物線ジャンプは、
上昇 と 落下 のアニメーションパートをつないだアニメーションです。
・_yAnimationIn は、
 (アニメ進捗率 前半)上昇パート用の Animation オブジェクトです。
・_yAnimationOut は、
 (アニメ進捗率 後半)落下パート用の Animation オブジェクトです。
・_yAnimation プロパティ getter 関数は、
 アニメ進捗率が 前半 0.0 〜 0.5 と 後半 0.5 〜 1.0で、
 パート実行区間ごとに 区間専用の Animation オブジェクト に切り替えます。
時間差実行アニメ (Curve Interval 版)
52
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true); // 正順,逆順,正順,逆順...の繰り返し。
// 縦方向は、放物線変化
_yAnimationIn = Tween(begin: 100.0, end: -100.0)
.animate(CurvedAnimation(
parent: _controller,
curve: Interval(0.0, 0.5, curve: ParabolaInCurve())));
_yAnimationOut = Tween(begin: -100.0, end: 100.0)
.animate(CurvedAnimation(
parent: _controller,
curve: Interval(0.5, 1.0, curve: ParabolaOutCurve())));
}
この Interval は、
放物線上昇パート用なので、
アニメ進捗率は、前半部 0.0 〜 0.5 を指定
ParabolaInCurve は、
放物線上昇の加速度変化を表す
独自の Curve派生クラスです。
時間差実行アニメ (Curve Interval 版)
53
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (BuildContext context, Widget child) {
return Transform(
alignment: Alignment.center,
origin: Offset(0.0, 0.0),
transform: Matrix4.translationValues(
_xAnimation.value,
_yAnimation.value,
0.0),
child: FlutterLogo(size: 150.0),
);
}
);
}
_yAnimation の実態は、
アニメの前半パート _yAnimationIn で、
アニメの後半パート _yAnimationOut に、
Animation オブジェクトの実体が切り替わってます。
時間差実行アニメ (Curve Interval 版)
54
// 放物線の高さ変化の演出(始端が高さ 0で終端で最高、最高速から減速していき停止)
class ParabolaInCurve extends Curve {
ParabolaInCurve() : super();
@override
double transform(double t) {
if (t == 0.0 || t == 1.0) return t;
return 1.0 - (1.0 - t)*(1.0 - t);
}
}
// 放物線の高さ変化の演出(始端が最高で終端で高さ 0、停止から加速していき最高速)
class ParabolaOutCurve extends Curve {
ParabolaOutCurve() : super();
@override
double transform(double t) {
if (t == 0.0 || t == 1.0) return t;
return t * t;
}
}
放物線の 上昇パート と 落下パート の
加速度変化を反映したアニメ進捗率値を算出する
独自の Curve派生クラス を定義しています。
 t にアニメ進捗率 0.0 と 1.0 が入る時には、
 必ず 0.0 と 1.0 を返していることに留意
ParabolaInCurve は、上昇パート用のため
割当られたアニメ進捗率区間は、0.0〜0.5ですが、
引数 t は、0.0〜1.0 が投入されることに留意!
時間差実行アニメ(TweenSequence 版)
55
Staggered animations by TweenSequence
 Tween のみで、
 項目 ④ Animation オブジェクトごとに時間差で描画/適用されるようにする
 …こともできます。
 Tween のリスト各要素が、順序付けで 指定区間専用に按分されるよう、
 TweenSequenceItem という Tween に重みを付けるクラス でラップして、
 TweenSequence で順序付按分した 各要素を1つの Tween に連結 させてから
 変化させるプロパティ値の Animation オブジェクト (1つ)を生成することで、
時間差で描画/適用されるようにしています。
 時間差実行アニメの実装自体は、     
 明示的なアニメーションの実装手法と基本的に同じです。
56
 TweenSequence class
 https://api.flutter.dev/flutter/animation/TweenSequence-class.html
時間差実行アニメサンプル (TweenSequence 版)
57
TweenSequence を使った時間差実行アニメの
放物線ジャンプ・サンプルコード
放物線ジャンプの 上昇パート と 落下パート を
TweenSequence と TweenSequenceItem を使って、
時間差実行させるサンプルコードを作りました。
このサンプルコードを基に、
明示的アニメの応用実装を紹介します。
Staggered animations by TweenSequence
https://dartpad.dev/embed-flutter.html?id=783257099f4e8207ac41a5ca13d466c7&split=70&theme=dark
時間差実行アニメ (TweenSequence 版)
58
AnimationController _controller;
Animation<double> _yAnimation;
放物線ジャンプは、
上昇 と 落下 のアニメーションパートをつないだアニメーションです。
・_yAnimation は、上昇パート と 落下パート を1つで扱える、
 放物線ジャンプの高さ用の Animation オブジェクトになっています。
時間差実行アニメ (TweenSequence 版)
59
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true); // 正順,逆順,正順,逆順...の繰り返し。
// 縦方向は、放物線変化
_yAnimation = TweenSequence(
[
TweenSequenceItem(
tween: ParabolaInTween(begin: 100.0, end: -100.0), weight: 1),
TweenSequenceItem(
tween: ParabolaOutTween(begin: -100.0, end: 100.0), weight: 1),
]
).animate(_controller);
}
この放物線上昇パートは、
TweenSequenceItem ラップで、
上昇 1 と 落下 1 の順序付按分により、
区間の進捗率は、0.0 〜 0.5 になります。
ParabolaInTween は、
放物線上昇の加速度変化を表す
独自の Tween派生クラスです。
時間差実行アニメ (TweenSequence 版)
60
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (BuildContext context, Widget child) {
return Transform(
alignment: Alignment.center,
origin: Offset(0.0, 0.0),
transform: Matrix4.translationValues(
_xAnimation.value,
_yAnimation.value,
0.0),
child: FlutterLogo(size: 150.0),
);
}
);
}
基本的に、
明示的なアニメーションの実装パターンと同じです。
時間差実行アニメ (TweenSequence 版)
61
// 放物線の高さ変化の演出(始端が高さ 0で終端で最高、最高速から減速していき停止)
class ParabolaInTween extends Tween<double> {
ParabolaInTween({ double begin, double end }) : super(begin: begin, end: end);
@override
double lerp(double t) {
return end - (end - begin) * (1.0 - t)*(1.0 - t);
}
}
// 放物線の高さ変化の演出(始端が最高で終端で高さ 0、停止から加速していき最高速)
class ParabolaOutTween extends Tween<double> {
ParabolaOutTween({ double begin, double end }) : super(begin: begin, end: end);
@override
double lerp(double t) {
return begin + (end - begin) * (t * t);
}
}
放物線の 上昇パート と 落下パート の
加速度変化を反映したプロパティ値を算出する
独自の Tween派生クラス を定義しています。
ParabolaIOutTween は、落下パート用のため、
割当られるアニメ進捗率区間は、0.5 〜 1.0 ですが、
引数 t には、0.0 〜 1.0 が投入されることに留意!
Transform ウィジェット
サンプル内で使った Transform ウィジェットを紹介します。
62
Transform ウィジェット
Transform
Object > Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget
https://api.flutter.dev/flutter/widgets/Transform-class.html
● Widget を変形させるクラスです。
位置(X,Y座標)や、サイズの拡大/縮小や、
XYZ軸ごとの 2D回転および、
3D回転(手前を大きく、奥を小さく描画 ) の
変更/変形を指定して描画させます。
概要を紹介する公式動画もあります。
63
動画で紹介されている使い方
64
// π/4ラジアンで、45度 2D回転
import 'dart:math' as math;
Transform.rotate(ラジアン
angle: math.pi / 4,
child: MyIcon(),
)
// 横方向にずらした平行四辺形に変形
iTransform(
transform: Matrix4.skewX(0.3),
child: MyIcon(),
)
// 1.5倍に拡大
Transform.scale(
scale: 1.5,
child: MyIcon(),
)
// 手前を大きく、奥を小さく 3D回転
// (alignmentで座標を画面中央に指定 )
Transform(
transform: Matrix4.identity()
..setEntry(3,2,0.01)
..rotateX(0.6),
alignment: Fractional0ffset.center,
child: MyIcon(),
)
// XY方向に 50づつ、位置移動
Transform.translate(
offset: Offset(50,50),
child: MyIcon(),
)
Transform 描画をアニメーションさせる
Transform ウィジェットは、位置移動や、拡大/縮小したり、
2Dや3D回転させた Widget を描画してくれますが、
そのままでは、静止画になってしまいます。
Explicit 明示的アニメーションの手法を使えば、
Transform ウィジェットで Widget を動かせます。  
3次元回転を使った
アニメサンプルを作ってみました。
65
 
66
Transform を使った3次元回転サンプル
gist 保管されたサンプルアニメ・コード
https://gist.github.com/cch-robo/1f60de0bfbd9887bdff672639832cd54
サンプルアニメ・コードのDartPad ページ埋込
https://dartpad.dev/embed-flutter.html?id=1f60de0bfbd9887bdff6726398
32cd54&theme=dark
ブラウザ上でアニメを動かして、
  コードを確認してくださいね。
Transform を使った3次元回転(実装例)
67
class _MyStatefulWidgetState extends State<MyStatefulWidget>
with SingleTickerProviderStateMixin {
AnimationController _controller;
Animation<double> _rotateAanimation;
Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 5000),
vsync: this,
)..forward();
_rotateAanimation = Tween<double>(begin: 0.0, end: 6.0 * math.pi)
.chain(CurveTween(curve: Curves.easeOutQuart)).animate(_controller); // 回転×3
_scaleAnimation = Tween<double>(begin: 0.0, end: 2.0)
.chain(CurveTween(curve: Curves.easeOutQuart)).animate(_controller);
}
 Transform ウィジェットを
 プロパティ値を変化させながら、
 連続で描画させるための手法は、
 明示的なアニメーションの
 基本的な実装手法しか使っていません。
Transform を使った3次元回転(実装例)
68
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (BuildContext context, Widget child) {
return Transform(
alignment: Alignment.center,
transform: Matrix4.identity()
..setEntry(3, 2, 0.001) // Widget 3D化指定
..rotateX(_rotateAanimation.value) // Widget 回転
..scale(_scaleAnimation.value), // Widget 拡大
child: FlutterLogo(size: 150.0),
);
}
);
}
}
 明示的なアニメーションの基本的な実装手法として、
 AnimationBuilder を使って、プロパティ値の変化ごとに
 Transform ウィジェットが描画されるようにしています。
参考資料
● A Deep Dive Into Transform Widgets in Flutter
https://medium.com/flutter-community/a-deep-dive-into-transform-widgets-in-flutter-4dc32cd575a9
● Flutter Animation has Never Been Easier — Part 1
https://medium.com/flutter-community/flutter-animation-has-never-been-easier-part-1-e378e82b2508
● Example Animations in Flutter — #2
https://medium.com/flutterdevs/example-animations-in-flutter-2-1034a52f795b
● Advanced Flutter Animations – Staggered Animations, Tween Chaining and Transforms
https://blog.flexiple.com/advanced-flutter-animations/
● Perspective on Flutter
https://medium.com/flutter/perspective-on-flutter-6f832f4d912e
● Advanced Flutter: Matrix4 And Perspective Transformations
https://blog.codemagic.io/flutter-matrix4-perspective-transformations/
備考)Matrix4 とは、4行4列(要素数16個)の行列を示す。
69
気をつけよう
単純なアニメに見えても、明示的アニメにする必要のあるパターン
・アニメの繰返再生が必要  (AnimationController が必要なため)
・プロパティ値の変化が不連続(暗黙的アニメは、前値から変化させるため)
・複数のアニメーション・パートが必要(応用編参照)
Animation#value は、オブジェクトによって意味が違う
・Tween().animate() で生成したオブジェクトは、変化するプロパティ値。
・AnimationController は、クロック / アニメ進捗率 の意味になる。
Tween と Curve でのプロパティ値変化は、微妙に意味が違う
・Tween は、クロック / アニメ進捗率に触れず、プロパティ値の変化に重み付けを与える。
・Curve は、クロック / アニメ進捗率の変化に重みをつけることで、プロパティ値にも重みを与える。
70
71
ご清聴、
ありがとうございました。
情報修正があれば更新します
最新版スライドは こちらから
 
資料室
72
 
Flutter のアニメーションについては、
公式ページ https://flutter.dev/ にまとめられています。
基礎知識 や 特殊なアニメーション については、
次ページからのリンク先を学ぶことになります。
73
アニメーションの基礎知識
Docs > Development > UI > Animations
● Introduction to animations
https://flutter.dev/docs/development/ui/animations
● Animations overview
https://flutter.dev/docs/development/ui/animations/overview
● Animations tutorial
https://flutter.dev/docs/development/ui/animations/tutorial
● Implicit Animations
https://flutter.dev/docs/development/ui/animations/implicit-animations
● Hero Animations
https://flutter.dev/docs/development/ui/animations/hero-animations
● Staggered Animations
https://flutter.dev/docs/development/ui/animations/staggered-animations 74
特殊なアニメーション
Animation > Docs > Cookbook > Animation
https://flutter.dev/docs/cookbook/animation
● Animate a page route transition
https://flutter.dev/docs/cookbook/animation/page-route-animation.html
● Animate a widget using a physics simulation
https://flutter.dev/docs/cookbook/animation/physics-simulation.html
● Animate the properties of a container
https://flutter.dev/docs/cookbook/animation/animated-container.html
● Fade a widget in and out
https://flutter.dev/docs/cookbook/animation/opacity-animation.html
75
アニメーションウィジェット 一覧(主なもの)
Docs > Development > UI > Widgets > Widget catalog
https://flutter.dev/docs/development/ui/widgets
● Animation and motion widgets
Docs > Development > UI > Widgets > Animation
https://flutter.dev/docs/development/ui/widgets/animation
76
Flutter in Focus - Animations(Video)
1. Implicit Animations
2. TweenAnimationBuilder
3. Build-in Explicit Animations
4. AnimatedBuilder/AnimatedWidget
5. Animation Deep Dive
How to choose which Flutter Animation Widget
is right for you?
Flutter in Focus
https://www.youtube.com/playlist?list=PLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2
77
Flutter in Focus - Animations (Blog)
● Flutter animation basics with implicit animations
https://medium.com/flutter/flutter-animation-basics-with-implicit-animations-95db481c5916
● Custom Implicit Animations in Flutter…with TweenAnimationBuilder
https://medium.com/flutter/custom-implicit-animations-in-flutter-with-tweenanimationbuilder-c76540b47185
● Directional animations with built-in explicit animations
https://medium.com/flutter/directional-animations-with-built-in-explicit-animations-3e7c5e6fbbd7
● When should I use AnimatedBuilder or AnimatedWidget?
https://medium.com/flutter/when-should-i-useanimatedbuilder-or-animatedwidget-57ecae0959e8
● Animation deep dive
https://medium.com/flutter/animation-deep-dive-39d3ffea111f
● How to Choose Which Flutter Animation Widget is Right for You?
https://medium.com/flutter/how-to-choose-which-flutter-animation-widget-is-right-for-you-79ecfb7e72b5
78
Flutter Europe(Video)
Flutter Europe: Animations in Flutter done right
https://www.youtube.com/watch?v=wnARLByOtKA&t=0s
79
日本語でのアニメーション解説
アニメーション対応 Widget の具体的な使い方は、
こちらのブログ記事が詳しいです。
● Flutterのお手軽にアニメーションを扱えるAnimated系Widgetをすべて紹介
シンプルなアニメーションは ImplicitlyAnimatedWidgetで扱うと楽に組めます
https://medium.com/flutter-jp/implicit-animation-b9d4b7358c28
● FlutterのTransition系アニメーションWidgetをすべて紹介
AnimationControllerの扱い方も手厚く解説
https://medium.com/flutter-jp/transition-9c57528c84b8
● “The Boring Flutter Development Show” で
取り上げられたアニメーションを様々な方法で書きながら解説   
ImplicitlyAnimatedWidgetを継承してお手軽系アニメーション Widgetを自作
https://medium.com/flutter-jp/custom-animation-c87e9d55b03b 80

More Related Content

What's hot

Qiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスQiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスTomoki Kuriyama
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE Inc.
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 
プロのためのNode-RED再入門
プロのためのNode-RED再入門プロのためのNode-RED再入門
プロのためのNode-RED再入門Makoto SAKAI
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するIgaHironobu
 
LINE API 紹介&LINE API Use Case(Azure編)
LINE API 紹介&LINE API Use Case(Azure編)LINE API 紹介&LINE API Use Case(Azure編)
LINE API 紹介&LINE API Use Case(Azure編)拓将 平林
 
シリコンバレー流開発スタイル
シリコンバレー流開発スタイルシリコンバレー流開発スタイル
シリコンバレー流開発スタイルKohei Taniguchi
 
KinectでAR空間に入り込もう
KinectでAR空間に入り込もうKinectでAR空間に入り込もう
KinectでAR空間に入り込もうTakashi Yoshinaga
 
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】Unity Technologies Japan K.K.
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こうShinnosuke Tokuda
 
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説UnityTechnologiesJapan002
 
VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方VirtualCast, Inc.
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド増田 亨
 
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディングオタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング虎の穴 開発室
 
Node-REDをIoTビジネスに適用するために苦労した3つの話
Node-REDをIoTビジネスに適用するために苦労した3つの話Node-REDをIoTビジネスに適用するために苦労した3つの話
Node-REDをIoTビジネスに適用するために苦労した3つの話Tomohiro Nakajima
 
Amazon product advertising apiで遊んでみた
Amazon product advertising apiで遊んでみたAmazon product advertising apiで遊んでみた
Amazon product advertising apiで遊んでみたYoichi Toyota
 

What's hot (20)

Qiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスQiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービス
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
プロのためのNode-RED再入門
プロのためのNode-RED再入門プロのためのNode-RED再入門
プロのためのNode-RED再入門
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
 
LINE API 紹介&LINE API Use Case(Azure編)
LINE API 紹介&LINE API Use Case(Azure編)LINE API 紹介&LINE API Use Case(Azure編)
LINE API 紹介&LINE API Use Case(Azure編)
 
シリコンバレー流開発スタイル
シリコンバレー流開発スタイルシリコンバレー流開発スタイル
シリコンバレー流開発スタイル
 
KinectでAR空間に入り込もう
KinectでAR空間に入り込もうKinectでAR空間に入り込もう
KinectでAR空間に入り込もう
 
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
 
VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方VRM 標準シェーダ MToon の使い方
VRM 標準シェーダ MToon の使い方
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal Engine
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド
 
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディングオタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
 
Node-REDをIoTビジネスに適用するために苦労した3つの話
Node-REDをIoTビジネスに適用するために苦労した3つの話Node-REDをIoTビジネスに適用するために苦労した3つの話
Node-REDをIoTビジネスに適用するために苦労した3つの話
 
Amazon product advertising apiで遊んでみた
Amazon product advertising apiで遊んでみたAmazon product advertising apiで遊んでみた
Amazon product advertising apiで遊んでみた
 

Similar to 明示的アニメで、Flutterアニメーション入門

MRTK V2.3 Spatial Awareness
MRTK V2.3 Spatial AwarenessMRTK V2.3 Spatial Awareness
MRTK V2.3 Spatial AwarenessYuichi Ishii
 
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 Fumiya Sakai
 
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。Daisuke Yamashita
 
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Yamato Honda
 
KinectプログラミングStepByStep
KinectプログラミングStepByStepKinectプログラミングStepByStep
KinectプログラミングStepByStep信之 岩永
 
Flutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_SummaryFlutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_Summarycch-robo
 
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み慎一 古賀
 
Kinectプログラミング Step by Step
Kinectプログラミング Step by StepKinectプログラミング Step by Step
Kinectプログラミング Step by StepAkira Hatsune
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてTatsuhiko Yamamura
 
Kinect Camp with TMCN / Kinect入門ハンズオン 2015.06.06
Kinect Camp with TMCN/ Kinect入門ハンズオン 2015.06.06Kinect Camp with TMCN/ Kinect入門ハンズオン 2015.06.06
Kinect Camp with TMCN / Kinect入門ハンズオン 2015.06.06Akira Hatsune
 
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?IoTビジネス共創ラボ
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏Yusuke Hirao
 
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageViewTitanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView濱田 章吾
 
Xcodeプラグインで快適な開発ライフを
Xcodeプラグインで快適な開発ライフをXcodeプラグインで快適な開発ライフを
Xcodeプラグインで快適な開発ライフをYuki Hirai
 
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンスTatsuhiko Tanaka
 
Tizen web app について調べたよ
Tizen web app について調べたよTizen web app について調べたよ
Tizen web app について調べたよNaruto TAKAHASHI
 
Core Animation 使って見た
Core Animation 使って見たCore Animation 使って見た
Core Animation 使って見たOCHI Shuji
 

Similar to 明示的アニメで、Flutterアニメーション入門 (20)

MRTK V2.3 Spatial Awareness
MRTK V2.3 Spatial AwarenessMRTK V2.3 Spatial Awareness
MRTK V2.3 Spatial Awareness
 
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
 
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
 
AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!
 
KinectプログラミングStepByStep
KinectプログラミングStepByStepKinectプログラミングStepByStep
KinectプログラミングStepByStep
 
Flutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_SummaryFlutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_Summary
 
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
 
Kinectプログラミング Step by Step
Kinectプログラミング Step by StepKinectプログラミング Step by Step
Kinectプログラミング Step by Step
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
Kinect Camp with TMCN / Kinect入門ハンズオン 2015.06.06
Kinect Camp with TMCN/ Kinect入門ハンズオン 2015.06.06Kinect Camp with TMCN/ Kinect入門ハンズオン 2015.06.06
Kinect Camp with TMCN / Kinect入門ハンズオン 2015.06.06
 
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?
物流・社会インフラWG 活動内容のご紹介 Live Video Analytics は「カメラ+AI」ソリューション開発をどう変える?
 
Swift Study Vol.4
Swift Study Vol.4Swift Study Vol.4
Swift Study Vol.4
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
 
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageViewTitanium もくもく会第6回 Kii Cloud と TiGPUImageView
Titanium もくもく会第6回 Kii Cloud と TiGPUImageView
 
Xcodeプラグインで快適な開発ライフを
Xcodeプラグインで快適な開発ライフをXcodeプラグインで快適な開発ライフを
Xcodeプラグインで快適な開発ライフを
 
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
 
AIRKinect
AIRKinectAIRKinect
AIRKinect
 
Tizen web app について調べたよ
Tizen web app について調べたよTizen web app について調べたよ
Tizen web app について調べたよ
 
Core Animation 使って見た
Core Animation 使って見たCore Animation 使って見た
Core Animation 使って見た
 

More from cch-robo

go_router が隠してくれるもの
go_router が隠してくれるものgo_router が隠してくれるもの
go_router が隠してくれるものcch-robo
 
Introduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutterIntroduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_fluttercch-robo
 
Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告cch-robo
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門cch-robo
 
フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察cch-robo
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Dart言語の進化状況
Dart言語の進化状況Dart言語の進化状況
Dart言語の進化状況cch-robo
 
DartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようDartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようcch-robo
 
Dartでサーバレスサービス
DartでサーバレスサービスDartでサーバレスサービス
Dartでサーバレスサービスcch-robo
 
Pin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetPin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetcch-robo
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略cch-robo
 
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるBefore lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるcch-robo
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までcch-robo
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practicecch-robo
 
Loose and fluffy_ddd_intro
Loose and fluffy_ddd_introLoose and fluffy_ddd_intro
Loose and fluffy_ddd_introcch-robo
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。cch-robo
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるcch-robo
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法cch-robo
 

More from cch-robo (18)

go_router が隠してくれるもの
go_router が隠してくれるものgo_router が隠してくれるもの
go_router が隠してくれるもの
 
Introduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutterIntroduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutter
 
Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門
 
フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Dart言語の進化状況
Dart言語の進化状況Dart言語の進化状況
Dart言語の進化状況
 
DartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようDartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみよう
 
Dartでサーバレスサービス
DartでサーバレスサービスDartでサーバレスサービス
Dartでサーバレスサービス
 
Pin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetPin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widget
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
 
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるBefore lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux まで
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
Loose and fluffy_ddd_intro
Loose and fluffy_ddd_introLoose and fluffy_ddd_intro
Loose and fluffy_ddd_intro
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみる
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法
 

Recently uploaded

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Recently uploaded (11)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

明示的アニメで、Flutterアニメーション入門

  • 4. アニメーションの大別 How to Choose Which Flutter Animation Widget is Right for You? より、 アニメーションを大別すると、 主に描画ベースとコードベースの2種類に別れます。 ● 描画ベース(drawing-based)のアニメーションは、 Canvas に描画する線や画像のパラメータを変化させて再描画することで、 アニメーションを表現します。 ● コードベース(code-based)のアニメーションは、 特定のウィジェットのプロパティ値を変化させて再描画することで、 外観や遷移のアニメーションを表現します。 4
  • 5. 描画ベースのアニメーション CustomPaint ウイジェットと CustomPainter を使い、 CustomPainter#paint(Canvas, Size) メソッド内での描画… Canvas に描画する線や画像のパラメータ値を変化させて、 連続して再描画することで、アニメーションを表現します。 パラメータ値は、後述の 明示的アニメーション 方式をベースにして、 AnimationController と Tween や Cureve を使った手法で変化させます。 https://api.flutter.dev/flutter/widgets/CustomPaint-class.html https://api.flutter.dev/flutter/rendering/CustomPainter-class.html https://api.flutter.dev/flutter/dart-ui/Canvas-class.html 5
  • 8. Explicit 明示的なアニメーション  アニメーションの再生や停止、繰返逆転再生などの  アニメ実行操作や、複数のアニメを同期実行させるなど、  一般的に AnimationController で、  アニメの実行や同期管理が必要な実装形式です。  ウィジェットのプロパティ値を変化させながら、  連続して再描画させてアニメーションを表現するために、  AnimationControllerの他に Tween や Animation#value や、  AnimatedWidget と AnimatedBuilder ウィジェットを利用します。  ※変化演出のために CurvedAnimation と Curve も使います。 8
  • 9. Explicit 明示的なアニメーション (実装概要) 1. Ticker (アニメーションフレームのハンドラ)を取得できるようにします。 2. AnimatedBuilder などでアニメ中に連続して再描画されるようにします。 3. AnimationController を vsync と duration を指定して生成します。      vsync で Ticker 提供元、duration でアニメ継続時間を指定します。 4. Tween に変化させるプロパティ型の 初期値 と 終了値 を設定して、 5. 変化するプロパティ値を提供する Animation オブジェクトを生成し、 6. その値(Animation#value)をウィジェットのプロパティ値に適用します。 7. アニメを実行します。   アニメ継続時間中は、クロック/進捗率に従ってプロパティ値が変化し、   フレームごとにウィジェットが再描画されることでアニメが表現されます。 9
  • 10. Explicit 明示的なアニメーション (用語説明) ・フレームは、アニメーションにおける映画フィルムでの1コマを表す概念  スマフォなら 60fps〜120fps ・Ticker は、アニメーションフレームのハンドラです。  アニメーション・フレームごとに 指定関数を呼び出し、  内部的には、フレームごとの連続した描画(実態は setState() 実行)に使われます。 ・クロック / 進捗率 は、アニメの進捗状況を 0.0〜1.0 で表す概念(独自造語)  アニメ開始時は 0.0 で、アニメ終了時(アニメ継続時間に到達時 )に 1.0 になります。  その実態は、AnimationController における Animation#vaue 値です。 ・Tween は、アニメ進捗率と 初期値 / 終了値 とのマッパーです。  アニメ進捗率の 0.0 と 1.0 に 初期値 と 終了値 が対応するようにして、  変化するプロパティ値が、描画時のアニメ進捗率に対応するようにします。 10
  • 11. Explicit 明示的なアニメーション (用語説明) ・変化するプロパティ値を提供する Animation オブジェクトとは、  Tween#animate(animation) で返される Animation オブジェクトです。  変化するプロパティ値の実態は、Tween から生成した Animation#vaue 値です。 ・アニメの実行とは、AnimationController の forward メソッドなどの実行です。  他に stop や reset などもあり、repeat(reverse:true) で折返再生もできます。 ・CurvedAnimation で AnimationController をラップすれば、  クロック / アニメ進捗率 の進行を 任意非線形することもできます。  具体的には、CurvedAnimation の parent に AnimationController を、  curve に Curve派生物 を指定すれば、クロックが非線形進行に変換され、  結果的に プロパティ値の変化に 加速度変化を与える ようなこと もできます。   Tween は、クロック / アニメ進捗率に触れず、プロパティ値の変化に重み付けを与えるのに対し、   Curve は、クロック / アニメ進捗率の変化に重みをつけることで、プロパティ値に重みを与えます。 11
  • 12. Explicit 明示的なアニメーション (実装手段)   12 明示的アニメの実装手段は 4種類あります。 ・基盤ウィジェットベース  AnimatedBuilder  AnimatedWidget ・組込済ウィジェットベース  XXX Transition ・描画ベース  CustomPainter (本稿では扱いません) How to choose which Flutter Animation Widget is right for you? - Flutter in Focus https://www.youtube.com/watch?v=GXIJJkq_H8g&feature=youtu.be&t=316 Flutter in Focus より
  • 14. Explicit 明示的なアニメ (AnimatedBuilder) 14 AnimatedBuilder リファレンスには、 Interactive App というブラウザ上で 動作を確認できるサンプルコードが  紹介されています。  このコードサンプルを基に、  Tween 関係のコードを少々加えて  明示的アニメの基本的な実装手順を  紹介します。 AnimatedBuilder class https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html
  • 15. Explicit 明示的なアニメ実装例 15 import 'package:flutter/material.dart'; import 'dart:math' as math; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { static const String _title = 'Flutter Code Sample'; @override Widget build(BuildContext context) { return MaterialApp( title: _title, home: MyStatefulWidget(), ); } } このページの実装は、 特に明示的アニメとは関係ありません。
  • 16. Explicit 明示的なアニメ実装例 16 class MyStatefulWidget extends StatefulWidget { MyStatefulWidget({Key key}) : super(key: key); @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> with TickerProviderStateMixin { AnimationController _controller; Animation<double> _angleAnimation; ⑤ 変化するプロパティ値を提供する   Animation オブジェクトのフィールドを宣言 ① TickerProviderStateMixinをミキシインして、   ウィジェットに TickerProviderを継承させる。    ウィジェットが Ticker を提供できるようにします。 水色の項目は、独自に追加した行です。 緑色の項目は、独自に変更した行です。
  • 17. Explicit 明示的なアニメ実装例 17 @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 10), vsync: this, )..repeat(); _angleAnimation = Tween(begin: 0.0, end: 2.0).animate(_controller); } @override void dispose() { _controller.dispose(); super.dispose(); } ③ AnimationController は、initStateで初期化  duration は、アニメーション継続時間  vsync は、Ticker 提供元になります。 ⑦ アニメを繰返実行   (無限ループ)させる。 ④ Tween に変化させるプロパティ型の   初期値 と 終了値 を設定します。  AnimationController は、  使い終わったら必ず  dispose() してください。 ⑤ 変化するプロパティ値を提供する   Animation オブジェクトを生成します。  クロック/アニメ進捗率を  提供するAnimation オブジェクト
  • 18. 18 @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, child: Container( width: 200.0, height: 200.0, color: Colors.green, child: const Center( child: Text('Whee!'), ), ), builder: (BuildContext context, Widget child) { return Transform.rotate( angle: _angleAnimation.value * math.pi, child: child, ); }, ); } } ⑥ 変化するプロパティ値を提供する   Animation オブジェクトのアニメーションプロパティ値を   ウィジェットのプロパティに適用します。   初期値 と 終了値 が アニメ進捗率 0.0 と 1.0 に対応するように   マッピングされるので、現在のアニメ進捗率に合わせた値が返ります。 ② AnimatedBuilder ウィジェットの builder 関数は、   アニメ継続時間中はフレームごとにコールされます。   ウィジェットは、連続して再描画されることになります。
  • 19. Explicit 明示的なアニメ実装例 (差異) 19 builder: (BuildContext context, Widget child) { return Transform.rotate( angle: _controller.value * 2.0 * math.pi, child: child, ); }, builder: (BuildContext context, Widget child) { return Transform.rotate( angle: _angleAnimation.value * math.pi, child: child, ); }, オリジナル行では、 AnimationController のクロック値 ⇒ アニメ進捗率 (0.0〜1.0)をそのまま使っていたので、 2π ⇒ 360度になるよう 2.0 を掛ける必要がありました。 改修版では、 Tweenで値の範囲を 0.0〜2.0 にしたので、 2.0 を掛ける必要がなくなっています。
  • 21. Explicit 明示的なアニメ(AnimatedWidget) 21 AnimatedWidget リファレンスにも、 Interactive App のサンプルコードが  紹介されています。  アニメ中に連続して再描画されるよう  継承ウィジェットを作ること② を除き、  AnimatedBuilder での明示的なアニメ実装  と本質的な違いはありません。 詳しくはサンプルコードを確認ください。 AnimatedWidget class https://api.flutter.dev/flutter/widgets/AnimatedWidget-class.html
  • 22. Explicit 明示的なアニメ(AnimatedWidget) 22 class SpinningContainer extends AnimatedWidget { const SpinningContainer({Key key, AnimationController controller}) : super(key: key, listenable: controller); Animation<double> get _progress => listenable; @override Widget build(BuildContext context) { return Transform.rotate( angle: _progress.value * 2.0 * math.pi, child: Container(width: 200.0, height: 200.0, color: Colors.green), ); } } ② AnimatedWidget 継承ウィジェットの build() は、   アニメ継続時間中はフレームごとにコールされます。   ウィジェットは、連続して再描画されることになります。 AnimatedWidget 継承ウィジェットには、 生成引数に AnimationController が必用
  • 23. Explicit 明示的なアニメ(AnimatedWidget) 23 class _MyStatefulWidgetState extends State<MyStatefulWidget> with TickerProviderStateMixin { AnimationController _controller; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 10), vsync: this, )..repeat(); }  AnimatedWidget 継承ウィジェットに渡される AnimationController は、  別のウィジェットで生成しています。 ① TickerProviderStateMixinをミキシインして、   ウィジェットに TickerProviderを継承させる。    ウィジェットが Ticker を提供できるようにします。 ③ AnimationController は、initStateで初期化  duration は、アニメーション継続時間  vsync は、Ticker 提供元になります。
  • 25. Explicit 明示的なアニメ (XXX Transition) 25 SlideTransition リファレンスにも、 Interactive App のサンプルコードが  紹介されています。 XXX Transition で命名されたウィジェットは、 AnimatedWidget や AnimatedBuilder が不要な、 明示的アニメーション対応のウィジェットです。 他にも FadeTransition、RotationTransition、 PositionedTransition、DecoratedBoxTransition、 ScaleTransition、AlignTransition…があります。 SlideTransition class https://api.flutter.dev/flutter/widgets/SlideTransition-class.html
  • 26. Explicit 明示的なアニメ (XXX Transition) 26 AnimationController _controller; Animation<Offset> _offsetAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, )..repeat(reverse: true); _offsetAnimation = Tween<Offset>( begin: Offset.zero, end: const Offset(1.5, 0.0), ).animate(CurvedAnimation( parent: _controller, curve: Curves.elasticIn, )); } @override Widget build(BuildContext context) { return SlideTransition( position: _offsetAnimation, child: const Padding( padding: EdgeInsets.all(8.0), child: FlutterLogo(size: 150.0), ), ); } XXX Transition で命名されたウィジェットは、 ④ ウィジェットのプロパティ値を変化させるため、 ⑤ AnimationController と Tween を利用しますが、 ② ウィジェット自体で、連続した再描画が行えるため、   AnimatedWidget や AnimatedBuilder 利用は不要です。 ⑥ プロパティも Animation オブジェクト対応なため、   そのまま適用 (Animation#value 記述不要)できます。
  • 27. Explicit 明示的なアニメ (XXX Transition) 27 AnimationController _controller; Animation<Offset> _offsetAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, )..repeat(reverse: true); _offsetAnimation = Tween<Offset>( begin: Offset.zero, end: const Offset(1.5, 0.0), ).animate(CurvedAnimation( parent: _controller, curve: Curves.elasticIn, )); } スライドの動きがアニメ終盤に急激に振幅するよう、 CurvedAnimation で AnimationController をラップして、 アニメ進捗率の進行 (等速変化)を curve で指定した 非線形の Curves.elasticIn に変換しています。 【補足】  SlideTransition のサンプルコードでは、  プロパティ値の変化に急激な動きの演出も               入れています。
  • 29. Implicit 暗黙的なアニメーション  暗黙的なアニメーションは、  AnimationController が不要で、ウィジェット描画で、  何もしなくてもアニメが実行されるアニメーションです。  (暗黙的に描画を契機にアニメ実行や同期管理がなされます)  ウィジェット自身がアニメ対応しているので、  duration 引数で アニメ継続時間 や、  curve 引数で アニメ進捗率の非線形変換 (変化演出) が指定でき、  アニメ対応プロパティ値を 現在値 から 指定値 まで変化させながら、  連続して自身を再描画させて外観や遷移のアニメを表現します 29
  • 30. Implicit 暗黙的なアニメーション (実装手段)   30 暗黙的アニメの実装手段は 2種類あります。 ・組込済ウィジェットベース  Animated XXX ・Tween組込済ウィジェットベース  TweenAnimationBuilder How to choose which Flutter Animation Widget is right for you? - Flutter in Focus https://www.youtube.com/watch?v=GXIJJkq_H8g&feature=youtu.be&t=264 Flutter in Focus より
  • 32. Implicit 暗黙的なアニメ (AnimatedContainer) 32 AnimatedContainer リファレンスには、 Interactive App というブラウザ上で 動作を確認できるサンプルコードが  紹介されています。  このサンプルコードを基に、  明示的アニメの実装を紹介します。 AnimatedContainer class https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
  • 33. Implicit 暗黙的なアニメ実装例 33 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { static const String _title = 'Flutter Code Sample'; @override Widget build(BuildContext context) { return MaterialApp( title: _title, home: Scaffold( appBar: AppBar(title: const Text(_title)), body: MyStatefulWidget(), ), ); } } このページの実装は、 特に暗黙的アニメとは関係ありません。
  • 34. Implicit 暗黙的なアニメ実装例 34 class MyStatefulWidget extends StatefulWidget { MyStatefulWidget({Key key}) : super(key: key); @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> { bool selected = false; @override Widget build(BuildContext context) { return GestureDetector( onTap: () { setState(() { selected = !selected; }); }, このページの実装は、 特に暗黙的アニメとは関係ありません。
  • 35. Implicit 暗黙的なアニメ実装例 35 child: Center( child: AnimatedContainer( width: selected ? 200.0 : 100.0, height: selected ? 100.0 : 200.0, color: selected ? Colors.red : Colors.blue, alignment: selected ? Alignment.center : AlignmentDirectional.topCenter, duration: Duration(seconds: 2), curve: Curves.fastOutSlowIn, child: FlutterLogo(size: 75), ), ), ); } } AnimatedContainer ウィジェットは、 アニメ継続時間中はフレームごとにコールされ 自身ウィジェットを、連続して再描画させます。 duration でアニメ継続時間を 2秒に指定 curve でアニメ進行率の変化演出を 初めは早くて後は遅くに指定しています。      (Curves.fastOutSlowIn ) アニメ対応プロパティ値は、 再描画時に現在値から指定値まで プロパティ値が変化していきます。 alignment を例にすれば、 初期表示はtopCenterなので、 タッチでtopCenter⇒centerになり、 次のタッチでは、center⇒topCenterに       変化することになります。
  • 36. Implicit 暗黙的なアニメ (Animated XXX) 36 Animated XXX で命名されたウィジェットは、 AnimatedContainer と同じように、 暗黙的アニメーション対応のウィジェットです。 他にも AnimatedAlign、AnimatedCrossFade、 AnimatedOpacity、AnimatedPhysicalModel、 AnimatedPadding、AnimatedPositioned、 AnimatedPositionedDirectional…があります。 Fade a widget in and out https://flutter.dev/docs/cookbook/animation/opacity-animation
  • 39. Implicit 暗黙的なアニメ (TweenAnimationBuilder) 39 Widget build(BuildContext context) { return TweenAnimationBuilder( tween: Tween<double>(begin: 0, end: targetValue), duration: Duration(seconds: 1), builder: (BuildContext context, double size, Widget child) { return IconButton( iconSize: size, color: Colors.blue, icon: child, onPressed: () { setState(() { targetValue = targetValue == 24.0 ? 48.0 : 24.0; }); }, ); }, child: Icon(Icons.aspect_ratio), ); } 子ウィジェットの Icon は単独なので、 ウィジェットツリーには含まれますが、 ここでの描画はないことに留意! tween で 初期値 と 終了値 を指定した、 アニメーション中に変化するプロパティ値 は、 ウィジェット描画を契機に、アニメ実行期間中、 変化しながら builder 引数の size に提供され続けます。 定義時に初期値 24.0 が設定済
  • 42. コーヒー・ブレイク  Flutter in Focus - Animations のブログ記事には、  アニメーションの基礎についての投稿があります。  よろしければ、御一読されてはいかがでしょうか。       スライド後ろの【資料室】にリンク集をまとめました。  右の例は、ビーム放射が拡大していくアニメーションを  Container ウィジェット(BoxDecoration の RadialGradient)で  円形グラデーションを描き、オリジナルのBeamClipper() で、  子ウイジェット(Container)を扇型状にくり抜いて描いています。 42 When should I useAnimatedBuilder or AnimatedWidget? https://medium.com/flutter/when-should-i-useanimatedbuilder-or-animatedwidget-57ecae0959e8
  • 44. Staggered animations とは Staggered pattern とは、 右図のようなタイル模様のことで、   ずらした配置の意だそうです。 Staggered animations とは、 「Aパートの後で、Bパートを実行させる」…のように、 複数のアニメーション・パートを 時間をずらして配置して、 1つながりにする手法、 時間差実行アニメーション を示します。 例えば放物線ジャンプなら、上昇パートの後に落下パートを配置して1つながりにします。 44
  • 45. Staggered animations / 時間差実行アニメーション Staggered animations ドキュメント(公式) には、 アニメーション・パートごとの複数のアニメーションを 時間差で実行させていくことで、1つのアニメにする    時間差実行アニメの実装手法例 が紹介されています。  45 Docs > Development > UI > Animations > taggered Staggered animations https://flutter.dev/docs/development/ui/animations/staggered-animations
  • 46. Staggered animations ドキュメント・キーポイント 1. Staggered animations は、時間差実行アニメーション アニメーション・パートごとの複数の Animation オブジェクトを 時間差で実行させていくことで、1つのアニメーションとする手法です。 2. AnimatedBuilder などでアニメ中に連続して再描画されるようにします。 3. Tween オブジェクトを アニメーション化するパートかつ、プロパティごとに設定します。 4. アニメーションパートごとに調歩をとった時間差描画ができるよう、 アニメする進捗率の区間が限定される Animationオブジェクトを生成して、 変化させるプロパティごとに適用させます。 5. 1つの AnimationController オブジェクト で、 すべての Animationオブジェクト を制御します。 46
  • 47. Staggered animations (実装手段)  時間差実行アニメのキーとなる、  アニメする進捗率の区間が限定される  パートごとの Animationオブジェクトの生成手段を                  2種類紹介します。 ● Curve Interval ベース アニメーション・パートごとに、 アニメ開始と アニメ終了の進捗率区間を 直接指定します。 ● TweenSequence ベース アニメーション・パートごとに、アニメ実行区間の重みをつけ、 全体を順序付按分して、アニメ開始と終了の進捗率区間を設定します。 47
  • 49. Staggered animations by curve Interval  Staggered animations ドキュメントでは、  項目 ④ Animation オブジェクトごとに時間差で描画/適用されるようにする  …ために、  CurvedAnimation の curve に Interval という、  指定区間のアニメ進捗率のときだけプロパティ変化を行なう  Curve派生クラスで、指定区間専用の Animation オブジェクト を生成し、  変化させるプロパティへの適用も、区間ごとに 指定区間専用 に切り替えて、 時間差で描画/適用されるようにしています。  時間差実行アニメの実装自体は、       明示的なアニメーションの実装手法と基本的に同じです。 49  Interval class  https://api.flutter.dev/flutter/animation/Interval-class.html
  • 50. 時間差実行アニメサンプル (Curve Interval 版) 50 Interval を使った時間差実行アニメの 放物線ジャンプ・サンプルコード 放物線ジャンプの 上昇パート と 落下パート を CurevedAnimation と curve Interval を使って、 時間差実行させるサンプルコードを作りました。 このサンプルコードを基に、 明示的アニメの応用実装を紹介します。 Staggered animations by Interval Curve https://dartpad.dev/embed-flutter.html?id=059f3a7b9055963b51e6fe5afe756011&split=70&theme=dark
  • 51. 時間差実行アニメ (Curve Interval 版) 51 AnimationController _controller; Animation<double> _yAnimationIn; Animation<double> _yAnimationOut; Animation<double> get _yAnimation => (_controller.value <= 0.5) ? _yAnimationIn : _yAnimationOut; 放物線ジャンプは、 上昇 と 落下 のアニメーションパートをつないだアニメーションです。 ・_yAnimationIn は、  (アニメ進捗率 前半)上昇パート用の Animation オブジェクトです。 ・_yAnimationOut は、  (アニメ進捗率 後半)落下パート用の Animation オブジェクトです。 ・_yAnimation プロパティ getter 関数は、  アニメ進捗率が 前半 0.0 〜 0.5 と 後半 0.5 〜 1.0で、  パート実行区間ごとに 区間専用の Animation オブジェクト に切り替えます。
  • 52. 時間差実行アニメ (Curve Interval 版) 52 @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, )..repeat(reverse: true); // 正順,逆順,正順,逆順...の繰り返し。 // 縦方向は、放物線変化 _yAnimationIn = Tween(begin: 100.0, end: -100.0) .animate(CurvedAnimation( parent: _controller, curve: Interval(0.0, 0.5, curve: ParabolaInCurve()))); _yAnimationOut = Tween(begin: -100.0, end: 100.0) .animate(CurvedAnimation( parent: _controller, curve: Interval(0.5, 1.0, curve: ParabolaOutCurve()))); } この Interval は、 放物線上昇パート用なので、 アニメ進捗率は、前半部 0.0 〜 0.5 を指定 ParabolaInCurve は、 放物線上昇の加速度変化を表す 独自の Curve派生クラスです。
  • 53. 時間差実行アニメ (Curve Interval 版) 53 @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (BuildContext context, Widget child) { return Transform( alignment: Alignment.center, origin: Offset(0.0, 0.0), transform: Matrix4.translationValues( _xAnimation.value, _yAnimation.value, 0.0), child: FlutterLogo(size: 150.0), ); } ); } _yAnimation の実態は、 アニメの前半パート _yAnimationIn で、 アニメの後半パート _yAnimationOut に、 Animation オブジェクトの実体が切り替わってます。
  • 54. 時間差実行アニメ (Curve Interval 版) 54 // 放物線の高さ変化の演出(始端が高さ 0で終端で最高、最高速から減速していき停止) class ParabolaInCurve extends Curve { ParabolaInCurve() : super(); @override double transform(double t) { if (t == 0.0 || t == 1.0) return t; return 1.0 - (1.0 - t)*(1.0 - t); } } // 放物線の高さ変化の演出(始端が最高で終端で高さ 0、停止から加速していき最高速) class ParabolaOutCurve extends Curve { ParabolaOutCurve() : super(); @override double transform(double t) { if (t == 0.0 || t == 1.0) return t; return t * t; } } 放物線の 上昇パート と 落下パート の 加速度変化を反映したアニメ進捗率値を算出する 独自の Curve派生クラス を定義しています。  t にアニメ進捗率 0.0 と 1.0 が入る時には、  必ず 0.0 と 1.0 を返していることに留意 ParabolaInCurve は、上昇パート用のため 割当られたアニメ進捗率区間は、0.0〜0.5ですが、 引数 t は、0.0〜1.0 が投入されることに留意!
  • 56. Staggered animations by TweenSequence  Tween のみで、  項目 ④ Animation オブジェクトごとに時間差で描画/適用されるようにする  …こともできます。  Tween のリスト各要素が、順序付けで 指定区間専用に按分されるよう、  TweenSequenceItem という Tween に重みを付けるクラス でラップして、  TweenSequence で順序付按分した 各要素を1つの Tween に連結 させてから  変化させるプロパティ値の Animation オブジェクト (1つ)を生成することで、 時間差で描画/適用されるようにしています。  時間差実行アニメの実装自体は、       明示的なアニメーションの実装手法と基本的に同じです。 56  TweenSequence class  https://api.flutter.dev/flutter/animation/TweenSequence-class.html
  • 57. 時間差実行アニメサンプル (TweenSequence 版) 57 TweenSequence を使った時間差実行アニメの 放物線ジャンプ・サンプルコード 放物線ジャンプの 上昇パート と 落下パート を TweenSequence と TweenSequenceItem を使って、 時間差実行させるサンプルコードを作りました。 このサンプルコードを基に、 明示的アニメの応用実装を紹介します。 Staggered animations by TweenSequence https://dartpad.dev/embed-flutter.html?id=783257099f4e8207ac41a5ca13d466c7&split=70&theme=dark
  • 58. 時間差実行アニメ (TweenSequence 版) 58 AnimationController _controller; Animation<double> _yAnimation; 放物線ジャンプは、 上昇 と 落下 のアニメーションパートをつないだアニメーションです。 ・_yAnimation は、上昇パート と 落下パート を1つで扱える、  放物線ジャンプの高さ用の Animation オブジェクトになっています。
  • 59. 時間差実行アニメ (TweenSequence 版) 59 @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, )..repeat(reverse: true); // 正順,逆順,正順,逆順...の繰り返し。 // 縦方向は、放物線変化 _yAnimation = TweenSequence( [ TweenSequenceItem( tween: ParabolaInTween(begin: 100.0, end: -100.0), weight: 1), TweenSequenceItem( tween: ParabolaOutTween(begin: -100.0, end: 100.0), weight: 1), ] ).animate(_controller); } この放物線上昇パートは、 TweenSequenceItem ラップで、 上昇 1 と 落下 1 の順序付按分により、 区間の進捗率は、0.0 〜 0.5 になります。 ParabolaInTween は、 放物線上昇の加速度変化を表す 独自の Tween派生クラスです。
  • 60. 時間差実行アニメ (TweenSequence 版) 60 @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (BuildContext context, Widget child) { return Transform( alignment: Alignment.center, origin: Offset(0.0, 0.0), transform: Matrix4.translationValues( _xAnimation.value, _yAnimation.value, 0.0), child: FlutterLogo(size: 150.0), ); } ); } 基本的に、 明示的なアニメーションの実装パターンと同じです。
  • 61. 時間差実行アニメ (TweenSequence 版) 61 // 放物線の高さ変化の演出(始端が高さ 0で終端で最高、最高速から減速していき停止) class ParabolaInTween extends Tween<double> { ParabolaInTween({ double begin, double end }) : super(begin: begin, end: end); @override double lerp(double t) { return end - (end - begin) * (1.0 - t)*(1.0 - t); } } // 放物線の高さ変化の演出(始端が最高で終端で高さ 0、停止から加速していき最高速) class ParabolaOutTween extends Tween<double> { ParabolaOutTween({ double begin, double end }) : super(begin: begin, end: end); @override double lerp(double t) { return begin + (end - begin) * (t * t); } } 放物線の 上昇パート と 落下パート の 加速度変化を反映したプロパティ値を算出する 独自の Tween派生クラス を定義しています。 ParabolaIOutTween は、落下パート用のため、 割当られるアニメ進捗率区間は、0.5 〜 1.0 ですが、 引数 t には、0.0 〜 1.0 が投入されることに留意!
  • 62. Transform ウィジェット サンプル内で使った Transform ウィジェットを紹介します。 62
  • 63. Transform ウィジェット Transform Object > Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget https://api.flutter.dev/flutter/widgets/Transform-class.html ● Widget を変形させるクラスです。 位置(X,Y座標)や、サイズの拡大/縮小や、 XYZ軸ごとの 2D回転および、 3D回転(手前を大きく、奥を小さく描画 ) の 変更/変形を指定して描画させます。 概要を紹介する公式動画もあります。 63
  • 64. 動画で紹介されている使い方 64 // π/4ラジアンで、45度 2D回転 import 'dart:math' as math; Transform.rotate(ラジアン angle: math.pi / 4, child: MyIcon(), ) // 横方向にずらした平行四辺形に変形 iTransform( transform: Matrix4.skewX(0.3), child: MyIcon(), ) // 1.5倍に拡大 Transform.scale( scale: 1.5, child: MyIcon(), ) // 手前を大きく、奥を小さく 3D回転 // (alignmentで座標を画面中央に指定 ) Transform( transform: Matrix4.identity() ..setEntry(3,2,0.01) ..rotateX(0.6), alignment: Fractional0ffset.center, child: MyIcon(), ) // XY方向に 50づつ、位置移動 Transform.translate( offset: Offset(50,50), child: MyIcon(), )
  • 65. Transform 描画をアニメーションさせる Transform ウィジェットは、位置移動や、拡大/縮小したり、 2Dや3D回転させた Widget を描画してくれますが、 そのままでは、静止画になってしまいます。 Explicit 明示的アニメーションの手法を使えば、 Transform ウィジェットで Widget を動かせます。   3次元回転を使った アニメサンプルを作ってみました。 65
  • 66.   66 Transform を使った3次元回転サンプル gist 保管されたサンプルアニメ・コード https://gist.github.com/cch-robo/1f60de0bfbd9887bdff672639832cd54 サンプルアニメ・コードのDartPad ページ埋込 https://dartpad.dev/embed-flutter.html?id=1f60de0bfbd9887bdff6726398 32cd54&theme=dark ブラウザ上でアニメを動かして、   コードを確認してくださいね。
  • 67. Transform を使った3次元回転(実装例) 67 class _MyStatefulWidgetState extends State<MyStatefulWidget> with SingleTickerProviderStateMixin { AnimationController _controller; Animation<double> _rotateAanimation; Animation<double> _scaleAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(milliseconds: 5000), vsync: this, )..forward(); _rotateAanimation = Tween<double>(begin: 0.0, end: 6.0 * math.pi) .chain(CurveTween(curve: Curves.easeOutQuart)).animate(_controller); // 回転×3 _scaleAnimation = Tween<double>(begin: 0.0, end: 2.0) .chain(CurveTween(curve: Curves.easeOutQuart)).animate(_controller); }  Transform ウィジェットを  プロパティ値を変化させながら、  連続で描画させるための手法は、  明示的なアニメーションの  基本的な実装手法しか使っていません。
  • 68. Transform を使った3次元回転(実装例) 68 @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (BuildContext context, Widget child) { return Transform( alignment: Alignment.center, transform: Matrix4.identity() ..setEntry(3, 2, 0.001) // Widget 3D化指定 ..rotateX(_rotateAanimation.value) // Widget 回転 ..scale(_scaleAnimation.value), // Widget 拡大 child: FlutterLogo(size: 150.0), ); } ); } }  明示的なアニメーションの基本的な実装手法として、  AnimationBuilder を使って、プロパティ値の変化ごとに  Transform ウィジェットが描画されるようにしています。
  • 69. 参考資料 ● A Deep Dive Into Transform Widgets in Flutter https://medium.com/flutter-community/a-deep-dive-into-transform-widgets-in-flutter-4dc32cd575a9 ● Flutter Animation has Never Been Easier — Part 1 https://medium.com/flutter-community/flutter-animation-has-never-been-easier-part-1-e378e82b2508 ● Example Animations in Flutter — #2 https://medium.com/flutterdevs/example-animations-in-flutter-2-1034a52f795b ● Advanced Flutter Animations – Staggered Animations, Tween Chaining and Transforms https://blog.flexiple.com/advanced-flutter-animations/ ● Perspective on Flutter https://medium.com/flutter/perspective-on-flutter-6f832f4d912e ● Advanced Flutter: Matrix4 And Perspective Transformations https://blog.codemagic.io/flutter-matrix4-perspective-transformations/ 備考)Matrix4 とは、4行4列(要素数16個)の行列を示す。 69
  • 70. 気をつけよう 単純なアニメに見えても、明示的アニメにする必要のあるパターン ・アニメの繰返再生が必要  (AnimationController が必要なため) ・プロパティ値の変化が不連続(暗黙的アニメは、前値から変化させるため) ・複数のアニメーション・パートが必要(応用編参照) Animation#value は、オブジェクトによって意味が違う ・Tween().animate() で生成したオブジェクトは、変化するプロパティ値。 ・AnimationController は、クロック / アニメ進捗率 の意味になる。 Tween と Curve でのプロパティ値変化は、微妙に意味が違う ・Tween は、クロック / アニメ進捗率に触れず、プロパティ値の変化に重み付けを与える。 ・Curve は、クロック / アニメ進捗率の変化に重みをつけることで、プロパティ値にも重みを与える。 70
  • 73.   Flutter のアニメーションについては、 公式ページ https://flutter.dev/ にまとめられています。 基礎知識 や 特殊なアニメーション については、 次ページからのリンク先を学ぶことになります。 73
  • 74. アニメーションの基礎知識 Docs > Development > UI > Animations ● Introduction to animations https://flutter.dev/docs/development/ui/animations ● Animations overview https://flutter.dev/docs/development/ui/animations/overview ● Animations tutorial https://flutter.dev/docs/development/ui/animations/tutorial ● Implicit Animations https://flutter.dev/docs/development/ui/animations/implicit-animations ● Hero Animations https://flutter.dev/docs/development/ui/animations/hero-animations ● Staggered Animations https://flutter.dev/docs/development/ui/animations/staggered-animations 74
  • 75. 特殊なアニメーション Animation > Docs > Cookbook > Animation https://flutter.dev/docs/cookbook/animation ● Animate a page route transition https://flutter.dev/docs/cookbook/animation/page-route-animation.html ● Animate a widget using a physics simulation https://flutter.dev/docs/cookbook/animation/physics-simulation.html ● Animate the properties of a container https://flutter.dev/docs/cookbook/animation/animated-container.html ● Fade a widget in and out https://flutter.dev/docs/cookbook/animation/opacity-animation.html 75
  • 76. アニメーションウィジェット 一覧(主なもの) Docs > Development > UI > Widgets > Widget catalog https://flutter.dev/docs/development/ui/widgets ● Animation and motion widgets Docs > Development > UI > Widgets > Animation https://flutter.dev/docs/development/ui/widgets/animation 76
  • 77. Flutter in Focus - Animations(Video) 1. Implicit Animations 2. TweenAnimationBuilder 3. Build-in Explicit Animations 4. AnimatedBuilder/AnimatedWidget 5. Animation Deep Dive How to choose which Flutter Animation Widget is right for you? Flutter in Focus https://www.youtube.com/playlist?list=PLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2 77
  • 78. Flutter in Focus - Animations (Blog) ● Flutter animation basics with implicit animations https://medium.com/flutter/flutter-animation-basics-with-implicit-animations-95db481c5916 ● Custom Implicit Animations in Flutter…with TweenAnimationBuilder https://medium.com/flutter/custom-implicit-animations-in-flutter-with-tweenanimationbuilder-c76540b47185 ● Directional animations with built-in explicit animations https://medium.com/flutter/directional-animations-with-built-in-explicit-animations-3e7c5e6fbbd7 ● When should I use AnimatedBuilder or AnimatedWidget? https://medium.com/flutter/when-should-i-useanimatedbuilder-or-animatedwidget-57ecae0959e8 ● Animation deep dive https://medium.com/flutter/animation-deep-dive-39d3ffea111f ● How to Choose Which Flutter Animation Widget is Right for You? https://medium.com/flutter/how-to-choose-which-flutter-animation-widget-is-right-for-you-79ecfb7e72b5 78
  • 79. Flutter Europe(Video) Flutter Europe: Animations in Flutter done right https://www.youtube.com/watch?v=wnARLByOtKA&t=0s 79
  • 80. 日本語でのアニメーション解説 アニメーション対応 Widget の具体的な使い方は、 こちらのブログ記事が詳しいです。 ● Flutterのお手軽にアニメーションを扱えるAnimated系Widgetをすべて紹介 シンプルなアニメーションは ImplicitlyAnimatedWidgetで扱うと楽に組めます https://medium.com/flutter-jp/implicit-animation-b9d4b7358c28 ● FlutterのTransition系アニメーションWidgetをすべて紹介 AnimationControllerの扱い方も手厚く解説 https://medium.com/flutter-jp/transition-9c57528c84b8 ● “The Boring Flutter Development Show” で 取り上げられたアニメーションを様々な方法で書きながら解説    ImplicitlyAnimatedWidgetを継承してお手軽系アニメーション Widgetを自作 https://medium.com/flutter-jp/custom-animation-c87e9d55b03b 80