アニメーションの学習


プロッタアニメーションの整理


Googleと公式ドキュメントで学んだことを整理したいです.実際に使っているコードはたくさんありますが、もっとよく理解して使いたいのでいろいろ探しました.

アニメーション操作構造


二つの仕事が必要です.
1)アニメーション情報を含むアニメーションオブジェクトを生成する.一般的に、この2つはAnimation自体とAnimationControllerです.
2)動画情報を受信して表示するように設定
ex)addListerとsetStateの組み合わせ./AnimatedWidgetによる継承

1.アニメーション基本オブジェクトの作成


Animation<T>


これはアニメの基本抽象類を活用するためです.アニメーションで使用されるオブジェクトの多くは、このクラスのサブクラスです.

AnimationController


アニメーションを制御するオブジェクト.
Animationを実行する方法があります.名前の通り、コントローラの役割.アニメーションを直接制御するには、そのオブジェクトを通過する必要があると考えられます.
実行方法!
ex) reverse()/repeat()/forward()
オブジェクトを宣言するときに必要なパラメータは2つあります.
  • duration:アニメーションの実行時間を決定します.
  • vsync:正確なコンセプトはわかりませんが、動画が壊されないようにうまく動いているので入れました.
  • Wtih SingleTickerProviderを使用して、アニメーションに表示される画面部品を混入します.次に、その部品自体を入れます.
    vsync:このような形で
    例を下図に示します.

    Animation<T>


    上のアニメーションコントローラでは、時間と水槽だけを調整した場合、特定のアニメーション値を追加するオブジェクトが必要になります.それがこれです.
    もう一つのAnimationは知っていますが、まず主に中間オブジェクトを利用して作成されたAnimationを使用します.
    Tween自体はアニメーションオブジェクトではなく、アニメーション可能なオブジェクトです.ここには追加の方法が必要です.

    これによりTweenオブジェクトの後ろにanimate()を貼り付けると、Animationオブジェクトに戻ります.
    animate()の中に他のanimationの標準として使えるanimationの対象を入れればいいのですが…これは何の話ですか.
    Aniamaion ControllerもAnimationのサブクラスです.AnimationControllerのもう1つの役割は、一定範囲(通常0〜1)の数値を連続的に生成することである.
    だから真ん中animationController(animation Controller)これにより、完了形式のアニメーションオブジェクトが生成されます.
    アニメイトの相手を言ったので紛らわしくてアレンジし直すと….
    不完全なアニメーションオブジェクトがあり、完全なアニメーションがあります.
    不完全な子供たちは特定の機能を中心に作られており、完全な子供たちはコントローラで制御できるアニメーションになりました.
    AnimationControllerは、完全なアニメーションを作成するための不完全なアニメーションです.
    完全なAnimation=Tween(いずれにしても).animate(AnimationController);こうなります!
    완전한 애니메이션 
    = _controller.drive(
      Tween<Offset>(
        begin: const Offset(100.0, 50.0),
        end: const Offset(200.0, 300.0),
      ),
    );
      이런식으로 만드는 것도 가능하다고 함.
    cf)CurvedAnimation->controllerアップグレード!
    final curve = CurvedAnimation(parent: controller, curve: Curves.bounceOut);
    このように定義すると、animationControllerにカーブ値が追加されます.curveは、値作成アレイを定義します.以下の説明を参照してください.
    https://api.flutter.dev/flutter/animation/Curves-class.html
    上のように定義します.
    .animationControllerではなくanimation Controller;こうやって入ればいい
    では、これまでにアニメーションのオブジェクトの作成が完了しました.
    では次のコーナーです.

    2.ビューをアニメーション化


    アニメーションは、パーツを自然に変えることです!->部品が変化することは,いわゆる状態管理→状態管理の代表的なsetStateが必要であることを意味する.
    あそこです.より自然になるためにsetStateはフレーム単位で非常に連続的に発生しなければなりません!!
    自然に連想できる最初の方法は根本的ですグラフィックアニメーションの根本原理と言える.

    addListerとsetStateの使用

    animation = Tween<double>(begin: 0, end: 300).animate(controller)
      ..addListener(() {
          setState(() {
             // The state that has changed here is the animation object’s value.
          });
        });
    addListenerを追加すると、アニメーションリファレンス値が変更されるたびにaddListerのコールバックが呼び出されます.中にsetStateが入っているので、再構築を続けるという意味です!
    cf)最終Animationオブジェクトは値を生成するジェネレータである.コントローラが指定した時間内に、Animationオブジェクトで定義した値を順番に増加させるジェネレータ!例えばbegin:0,end:300?durationは2秒です.
    2秒以内に0から300の値が表示されます.自然とアニメのように見えます!
    上は
    こう書けばアニメvalue 0->0.1のときaddListerが一度setStateをするのでこれが多く繰り返されますアニメみたいにこのような原理です!
    整理したものをみんなに見せると以下のようになります次のコードをよく読んで、上記のオブジェクトがどこで宣言されるべきか、どこで初期化されるべきか、何を書く必要があるかを理解すれば、全体に整理して理解することができます.
    コードを読み込む前に、initStateがすべてのプライマリオブジェクトを初期化することをさらに説明します.
    import 'package:flutter/material.dart';
    
    class NewPage extends StatefulWidget {
      const NewPage({Key? key}) : super(key: key);
    
      
      _NewPageState createState() => _NewPageState();
    }
    
    class _NewPageState extends State<NewPage> with SingleTickerProviderStateMixin {
    
      late Animation<double> animation;
      late AnimationController controller;
    
    
      
      void initState() {
        // TODO: implement initState
        super.initState();
        controller =
            AnimationController(vsync: this, duration: Duration(milliseconds: 1000));
        final curve = CurvedAnimation(parent: controller, curve: Curves.bounceOut);
        animation = Tween<double>(begin: 0,end: 300).animate(curve)
        ..addListener(() {
          setState(() {
    
          });
        });
    // 나중에 탭했을 때 실행되도록 하고싶으면 아래 코드를 다른 곳에 넣어주면 되겠지?
        controller.forward();
      }
    
      
      Widget build(BuildContext context) {
        return Center(
          child: Container(
            color: Colors.green,
            height: animation.value,
            width: animation.value,
          ),
        );
      }
    }
    
    このコードに従って実行すると、正方形が大きくなります.
    この方法の欠点はsetStateを用いることである.コンポーネント全体を再実行すると、メモリの構築効率が低下します.

    AnimatedWidgetの使用


    この友達を使うのはもっと簡単です.
    AnimatedWidgetは、StatfulWidgetを継承するクラスです.

    このようにAnimatedWidgetを継承して使用すればよい.
    addListenerを追加するのではなく、オブジェクトの作成から聴くアニメーションを受信します.これによりsetStateを使用する必要はなく、自分で適用することができます.
    AnimatedWidgetを継承する内蔵部品もあります.
    ~Trainitionのように終わる部品
    参考までに

    そうすると、不完全なアニメーションコントローラだけを入れても、アニメーションがうまくスクロールできます.コントローラから得られた値は、部品の目的に応じて変換されます.

  • RotationTransitionは変更できます.

  • FadeTransition不透明度の調整

    AnimatedBuilderの使用


    このような方法もあります.
    https://papabee.tistory.com/141
    詳しくはサイトを参照してください.上記の方法と似ていますが、classを定義していなくても使用できます.

    3)Implicitアニメーションをそのまま使用する。


    一番簡単です.状態管理を利用して値を変えるだけで、自然なアニメーションが実現できます.次に、暗黙的なアニメーションコンポーネントのリストを示します.