Flutter學(xué)習(xí)筆記33-交織動畫 Hero動畫

交織動畫

有些時候我們可能會需要一些復(fù)雜的動畫谍失,這些動畫可能由一個動畫序列或重疊的動畫組成,要實現(xiàn)這種效果拄查,使用交織動畫(Stagger Animation)會非常簡單跟畅。要創(chuàng)建交織動畫,需要使用多個動畫對象(Animation)晌块。一個AnimationController控制所有的動畫對象爱沟。給每一個動畫對象指定時間間隔。
所有動畫都由同一個AnimationController驅(qū)動匆背,無論動畫需要持續(xù)多長時間呼伸,控制器的值必須在0.0到1.0之間,而每個動畫的間隔也必須介于0.0和1.0之間钝尸。對于在間隔中設(shè)置動畫的每個屬性括享,需要分別創(chuàng)建一個Tween用于指定該屬性的開始值和結(jié)束值。也就是說0.0到1.0代表整個動畫過程珍促,也可以給不同動畫指定不同的起始點和終止點來決定它們的開始時間和終止時間铃辖。代碼示例:

class StaggerAnimationDemo extends StatefulWidget {
  @override
  _StaggerAnimationDemoState createState() => _StaggerAnimationDemoState();
}

class _StaggerAnimationDemoState extends State<StaggerAnimationDemo>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;

  Animation<double> _opacityAnimation;
  Animation<double> _sizeAnimation;
  Animation<Color> _colorAnimation;
  Animation<double> _radiansAnimation;

  @override
  void initState() {
    super.initState();
    // 創(chuàng)建AnimationController
    _controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 2),
    );

    // Tween
    _opacityAnimation =
        CurvedAnimation(parent: _controller, curve: Curves.easeIn);
    _sizeAnimation = Tween(
      begin: 50.0,
      end: 150.0,
    ).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Interval(
          0.0,
          0.6, // 間隔,前60%的動畫時間
          curve: Curves.ease,
        ),
      ),
    );
    _colorAnimation = ColorTween(
      begin: Colors.orange,
      end: Colors.purple,
    ).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Interval(
          0.0,
          0.6, // 間隔猪叙,前60%的動畫時間
          curve: Curves.ease,
        ),
      ),
    );
    _radiansAnimation = Tween(begin: 0.0, end: 2 * pi).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Interval(
          0.6,
          1.0, //間隔娇斩,后40%的動畫時間
          curve: Curves.ease,
        ),
      ),
    );

    // 監(jiān)聽動畫狀態(tài)改變
    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        _controller.reverse();
      } else if (status == AnimationStatus.dismissed) {
        _controller.forward();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StaggerAnimation Demo'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (context, child) {
            return Opacity(
              opacity: _opacityAnimation.value ?? 0.0,
              child: Transform(
                transform: Matrix4.rotationZ(_radiansAnimation.value),
                alignment: Alignment.center,
                child: Container(
                  width: _sizeAnimation.value,
                  height: _sizeAnimation.value,
                  color: _colorAnimation.value,
                ),
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.play_arrow),
        onPressed: () {
          if (_controller.isAnimating) {
            _controller.stop();
            print(_controller.status);
          } else if (_controller.status == AnimationStatus.forward) {
            _controller.forward();
          } else if (_controller.status == AnimationStatus.reverse) {
            _controller.reverse();
          } else {
            _controller.forward();
          }
        },
      ),
    );
  }

  @override
  void dispose() {
    // 釋放動畫資源
    _controller.dispose();
    super.dispose();
  }
}

Hero動畫

移動端開發(fā)會經(jīng)常遇到類似這樣的需求:點擊一個頭像,顯示頭像的大圖穴翩,并且從原來圖像的Rect到大圖的Rect犬第。點擊一個商品的圖片,可以展示商品的大圖芒帕,并且從原來圖像的Rect到大圖的Rect瓶殃。這種跨頁面共享的動畫被稱之為享元動畫(Shared Element Transition)。
在Flutter中副签,有一個專門的Widget可以來實現(xiàn)這種動畫效果:Hero,實現(xiàn)Hero動畫基矮,需要如下步驟:
1.在第一個Page1中淆储,定義一個起始的Hero Widget,被稱之為source hero家浇,并且綁定一個tag本砰;
2.在第二個Page2中,定義一個終點的Hero Widget钢悲,被稱之為destination hero点额,并且綁定相同的tag舔株;
3.可以通過Navigator來實現(xiàn)第一個頁面Page1到第二個頁面Page2的跳轉(zhuǎn)過程;
Flutter會設(shè)置Tween來界定Hero從起點到終端的大小和位置还棱,并且在圖層上執(zhí)行動畫效果载慈。代碼示例:

class HeroAnimationDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: GridView(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          crossAxisSpacing: 8,
          mainAxisSpacing: 8,
          childAspectRatio: 16 / 9,
        ),
        children: List.generate(20, (index) {
          final imageURL = "https://picsum.photos/500/500?random=$index";
          return GestureDetector(
            onTap: () {
              Navigator.of(context).push(
                PageRouteBuilder(
                    pageBuilder: (context, animation, secondaryAnimation) {
                  return FadeTransition(
                    opacity: animation,
                    child: ImageDetailPage(imageURL),
                  );
                }),
              );
            },
            child: Hero(
                tag: imageURL,
                child: Image.network(
                  imageURL,
                  fit: BoxFit.cover,
                )),
          );
        }),
      ),
    );
  }
}

class ImageDetailPage extends StatelessWidget {
  final String _imageURL;

  ImageDetailPage(this._imageURL);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.of(context).pop();
          },
          child: Hero(
            tag: _imageURL,
            child: Image.network(_imageURL),
          ),
        ),
      ),
    );
  }
}

代碼傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市珍手,隨后出現(xiàn)的幾起案子办铡,更是在濱河造成了極大的恐慌,老刑警劉巖琳要,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡具,死亡現(xiàn)場離奇詭異,居然都是意外死亡稚补,警方通過查閱死者的電腦和手機(jī)童叠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來课幕,“玉大人厦坛,你說我怎么就攤上這事∽颍” “怎么了粪般?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長污桦。 經(jīng)常有香客問我亩歹,道長,這世上最難降的妖魔是什么凡橱? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任小作,我火速辦了婚禮,結(jié)果婚禮上稼钩,老公的妹妹穿的比我還像新娘顾稀。我一直安慰自己,他們只是感情好坝撑,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布静秆。 她就那樣靜靜地躺著,像睡著了一般巡李。 火紅的嫁衣襯著肌膚如雪抚笔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天侨拦,我揣著相機(jī)與錄音殊橙,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛膨蛮,可吹牛的內(nèi)容都是我干的叠纹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敞葛,長吁一口氣:“原來是場噩夢啊……” “哼誉察!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起制肮,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冒窍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后豺鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體综液,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年儒飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了谬莹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桩了,死狀恐怖附帽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情井誉,我是刑警寧澤蕉扮,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站颗圣,受9級特大地震影響喳钟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜在岂,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一奔则、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔽午,春花似錦易茬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骄恶,卻和暖如春岸蜗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叠蝇。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悔捶。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓铃慷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜕该。 傳聞我的和親對象是個殘疾皇子犁柜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述 動畫API認(rèn)識 動畫案例練習(xí) 其它動畫補(bǔ)充 一、動畫API認(rèn)識 動畫實際上是我們通過某些方式(某種對象堂淡,An...
    IIronMan閱讀 362評論 1 3
  • 一. 動畫API認(rèn)識 動畫其實是我們通過某些方式(比如對象馋缅,Animation對象)給Flutter引擎提供不同的...
    happy神悅閱讀 262評論 0 2
  • 邂逅FLutter 萬物皆是Widget 一般縮進(jìn)2個空格 文字居中 Widget Center() Materi...
    JackLeeVip閱讀 3,176評論 0 4
  • 以下為對Flutter官網(wǎng)的學(xué)習(xí)總結(jié),如果你想快速掌握知識點绢淀,或者想復(fù)習(xí)一下官網(wǎng)學(xué)習(xí)的內(nèi)容萤悴,那么值得看看。轉(zhuǎn)載請注...
    申國駿閱讀 1,171評論 0 3
  • Flutter動畫學(xué)習(xí)效果直接貼代碼 運行看吧皆的,更改push入口查看不同動畫效果覆履。基礎(chǔ)動畫:顏色漸變费薄、控件大小更改...
    GA_閱讀 2,377評論 0 8