最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter封裝組動畫混合動畫AnimatedGroup示例詳解

 更新時間:2023年01月19日 10:31:59   作者:SoaringHeart  
這篇文章主要為大家介紹了Flutter封裝組動畫混合動畫AnimatedGroup示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、來源

項目中遇到混合動畫的情況,每次實現(xiàn)都需要生命一堆屬性,讓代碼變得雜亂,難以維護。

參考 iOS 組動畫 CAAimationGroup, 隨花半天時間封裝一個混合動畫組件 AnimatedGroup。

此組件基于極簡、高擴展、高適用的封裝原則,基本滿足當前項目開發(fā)。

二、AnimatedGroup使用示例:

//
//  AnimatedGroupDemo.dart
//  flutter_templet_project
//
//  Created by shang on 12/6/21 5:52 PM.
//  Copyright ? 12/6/21 shang. All rights reserved.
//
import 'package:flutter/material.dart';
import 'package:flutter_templet_project/basicWidget/animated_group.dart';
class AnimatedGroupDemo extends StatefulWidget {
  AnimatedGroupDemo({ Key? key, this.title}) : super(key: key);
  final String? title;
  @override
  _AnimatedGroupDemoState createState() => _AnimatedGroupDemoState();
}
class _AnimatedGroupDemoState extends State<AnimatedGroupDemo> {
  GlobalKey<AnimatedGroupState> _globalKey = GlobalKey();
  final _animations = <AnimatedGroupItemModel>[
    AnimatedGroupItemModel(
      tween: Tween<double>(begin: .0, end: 300.0,),
      begin: 0.0,
      end: 0.6
    ),
    AnimatedGroupItemModel(
      tween: ColorTween(begin: Colors.green, end: Colors.red,),
      begin: 0.0,
      end: 0.6
    ),
    AnimatedGroupItemModel(
      tween: Tween<EdgeInsets>(
        begin: const EdgeInsets.only(left: .0),
        end: const EdgeInsets.only(left: 100.0),
      ),
      begin: 0.6,
      end: 1.0
    ),
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title ?? "$widget"),
      ),
      body: Center(
        child: Column(
          children: [
            ElevatedButton(
              child: Text("start animation"),
              onPressed: (){
                _globalKey.currentState?.palyeAnimations(isRemovedOnCompletion: false);
              },
            ),
            Container(
              width: 300,
              height: 300,
              child: AnimatedGroup(
                key: _globalKey,
                duration: Duration(milliseconds: 2000),
                animations: _animations,
                child: Text("AnimatedGroupWidget 混合動畫", style: TextStyle(color: Colors.white, backgroundColor: Colors.green),),
                builder: (BuildContext context, Widget? child, List<Animation<dynamic>> animations) {
                  final aHeight = animations[0];
                  final aColor = animations[1];
                  final aPadding = animations[2];
                  return Stack(
                    children: [
                      Container(
                        alignment: Alignment.bottomCenter,
                        padding: aPadding.value,
                        child: Container(
                          color: aColor.value,
                          width: 50.0,
                          height: aHeight.value,
                        ),
                      ),
                      Center(child: child!)
                    ],
                  );
                },
              ),
              decoration: BoxDecoration(
                color: Colors.black.withOpacity(0.1),
                border: Border.all(
                  color: Colors.black.withOpacity(0.5),
                )
              ),
            )
          ],
        ),
      ),
    );
  }
}

三、AnimatedGroup源碼

//
//  AnimatedGroupDemo.dart
//  flutter_templet_project
//
//  Created by shang on 1/19/23 8:21 AM.
//  Copyright ? 1/19/23 shang. All rights reserved.
//
import 'package:flutter/material.dart';
/// 混合動畫回調(diào)類型
typedef AnimatedGroupBuilder = Widget Function(BuildContext context, Widget? child, List<Animation<dynamic>> animations);
class AnimatedGroup extends StatefulWidget {
  /// 混合動畫
  AnimatedGroup({
    Key? key,
    required this.animations,
    required this.builder,
    this.controller,
    this.duration = const Duration(milliseconds: 2000),
    this.child,
  }) : super(key: key);
  /// 混合動畫數(shù)組
  List<AnimatedGroupItemModel> animations;
  /// 混合動畫回調(diào)
  AnimatedGroupBuilder builder;
  /// 控制器
  AnimationController? controller;
  /// AnimationController 控制的 duration 屬性
  Duration? duration;
  /// 不需要多次構(gòu)建的部分
  Widget? child;
  @override
  AnimatedGroupState createState() => AnimatedGroupState();
}
/// 混合動畫 State
class AnimatedGroupState extends State<AnimatedGroup> with TickerProviderStateMixin {
  AnimationController? _controller;
  /// 僅限于無法滿足功能時使用(透傳對象, 方便二次開發(fā))
  AnimationController get controller => _controller!;
  List<Animation<dynamic>> _animations = [];
  @override
  void initState() {
    _controller = widget.controller ?? AnimationController(duration: widget.duration, vsync: this);
    _animations = widget.animations.map((e) => e.tween.animate(_buildAnim(e.begin, e.end))).toList();
    super.initState();
  }
  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _controller!,
      child: widget.child,
      builder: (BuildContext context, Widget? child){
        return widget.builder(context, child, _animations);
      }
    );
  }
  /// 開始執(zhí)行動畫
  ///
  /// isRemovedOnCompletion 是否單程動畫
  ///
  /// isReverse 是否逆轉(zhuǎn)動畫
  palyeAnimations({bool isRemovedOnCompletion = true, bool isReverse = false}) async {
    try {
      if (!isReverse) {
        await _controller?.forward().orCancel;
        if (!isRemovedOnCompletion) {
          await _controller?.reverse().orCancel;
        }
      } else {
        await _controller?.reverse().orCancel;
        if (!isRemovedOnCompletion) {
          await _controller?.forward().orCancel;
        }
      }
    } on TickerCanceled {
      // the animation got canceled, probably because we were disposed
    };
  }
  /// 創(chuàng)建動畫對象
  CurvedAnimation _buildAnim(double begin, double end) {
    return CurvedAnimation(
      parent: _controller!,
      curve: Interval(
        begin,
        end,
        curve: Curves.ease,
      ),
    );
  }
}
/// 混合動畫單個動畫模型
class AnimatedGroupItemModel{
  /// 混合動畫單個動畫模型
  AnimatedGroupItemModel({
    required this.tween,
    required this.begin,
    required this.end,
  });
  /// 動畫 Tween
  Tween tween;
  /// 動畫開始時間 (0 - 1.0)
  double begin;
  /// 動畫結(jié)束時間 (0 - 1.0)
  double end;
}

最后

代碼復制到項目中可直接運行;

github

以上就是Flutter封裝組動畫混合動畫AnimatedGroup示例詳解的詳細內(nèi)容,更多關(guān)于Flutter封裝AnimatedGroup的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android開發(fā)之自定義UI組件詳解

    Android開發(fā)之自定義UI組件詳解

    這篇文章主要給大家介紹了關(guān)于Android開發(fā)之自定義UI組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • OpenGL Shader實現(xiàn)簡單轉(zhuǎn)場效果詳解

    OpenGL Shader實現(xiàn)簡單轉(zhuǎn)場效果詳解

    轉(zhuǎn)場效果常出現(xiàn)再視頻剪輯當中,用于銜接兩段視頻片段切換的過渡效果。本文將介紹如何利用OpenGL Shader實現(xiàn)簡單的轉(zhuǎn)場效果,需要的小伙伴可以參考一下
    2022-02-02
  • 21天學習android開發(fā)教程之XML解析與生成

    21天學習android開發(fā)教程之XML解析與生成

    21天學習android開發(fā)教程之XML解析與生成,使用SAX來解析XML,在Android里面可以使用SAX和DOM,DOM需要把整個XML文件讀入內(nèi)存再解析,比較消耗內(nèi)存,而SAX基于事件驅(qū)動的處理方式,可以在各節(jié)點觸發(fā)回調(diào)函數(shù),需要的朋友可以參考下
    2016-02-02
  • Android開發(fā)中的文件操作工具類FileUtil完整實例

    Android開發(fā)中的文件操作工具類FileUtil完整實例

    這篇文章主要介紹了Android開發(fā)中的文件操作工具類FileUtil,結(jié)合完整實例形式分析了Android文件操作的常用技巧,包括文件的獲取、遍歷、搜索、復制、刪除、判斷等功能,需要的朋友可以參考下
    2017-11-11
  • android教程之使用asynctask在后臺運行耗時任務

    android教程之使用asynctask在后臺運行耗時任務

    AsyncTask用在需要在ui線程中調(diào)用、在背景線程中執(zhí)行耗時任務、并且在ui線程中返回結(jié)果的場合。下面就是一個在背景中運行的AsyncTask的實現(xiàn)DownloadDBTask
    2014-02-02
  • Android測量每秒幀數(shù)Frames Per Second (FPS)的方法

    Android測量每秒幀數(shù)Frames Per Second (FPS)的方法

    這篇文章主要介紹了Android測量每秒幀數(shù)Frames Per Second (FPS)的方法,涉及Android針對多媒體文件屬性操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android 集成Google Cast 異常問題解析

    Android 集成Google Cast 異常問題解析

    這篇文章主要為大家介紹了Android 集成Google Cast 異常問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Android實現(xiàn)底部切換標簽

    Android實現(xiàn)底部切換標簽

    這篇文章主要為大家詳細介紹了Android實現(xiàn)底部切換標簽,嵌套Fragment,方便自定義布局,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android中AsyncTask異步任務使用詳細實例(一)

    Android中AsyncTask異步任務使用詳細實例(一)

    AsyncTask是Android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現(xiàn)異步操作,并提供接口反饋當前異步執(zhí)行的程度(可以通過接口實現(xiàn)UI進度更新),最后反饋執(zhí)行的結(jié)果給UI主線程,通過本文給大家介紹Android中AsyncTask異步任務使用詳細實例(一),需要的朋友參考下
    2016-02-02
  • 完美解決Android客戶端RSA解密部分亂碼的問題

    完美解決Android客戶端RSA解密部分亂碼的問題

    下面小編就為大家分享一篇完美解決Android客戶端RSA解密部分亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評論

东源县| 吴江市| 开鲁县| 上高县| 桐柏县| 华蓥市| 宜川县| 汽车| 聂拉木县| 宜兰市| 宜宾县| 普定县| 永兴县| 杭锦旗| 大悟县| 定远县| 徐州市| 香港 | 九寨沟县| 藁城市| 榕江县| 定襄县| 古蔺县| 孝感市| 哈密市| 海阳市| 武威市| 敦化市| 平舆县| 新和县| 四平市| 兖州市| 水城县| 黄骅市| 如皋市| 太康县| 道孚县| 赤城县| 台州市| 蒙山县| 犍为县|