Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画

html 复制代码
配置vsync,需要实现一下with SingleTickerProviderStateMixin
js 复制代码
class _MyHomePageState extends State<MyHomePage>  with SingleTickerProviderStateMixin{
  // late延迟初始化  AnimationController
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化 AnimationController
    _controller = AnimationController(
      duration: const Duration(milliseconds: 500),
      vsync:this, // 让程序和手机的刷新频率统一
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('标题'),
      ),
      body: Center(
        child: Column(
          children: [
            AnimatedIcon(icon: AnimatedIcons.menu_close, progress: _controller,size: 40,color: Colors.red,),
            ElevatedButton(onPressed: (){
              _controller.forward();
            }, child: const Text('播放')),
            ElevatedButton(onPressed: (){
              _controller.reverse();
            }, child: const Text('返回')),
          ],
        ),
      ),
    );
  }
}

AnimatedIcons参数选项包含:

复制代码
add_event
arrow_menu
close_menu
ellipsis_search
event_add
home_menu
list_view
menu_arrow
menu_close
menu_home
pause_play
play_pause
search_ellipsis
view_list

上边没有想要的图标,那么就需要自己实现2个图标间的交错式动画

js 复制代码
class _MyHomePageState extends State<MyHomePage>  with SingleTickerProviderStateMixin{
  // 定义 AnimationController
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化 AnimationController
    _controller = AnimationController(
      duration: const Duration(milliseconds: 1000),
      vsync:this, // 让程序和手机的刷新频率统一
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('标题'),
      ),
      body: Column(
        children: [
          // 定义Stack,使2个图标重叠摆放
          Stack(
            children: [
              // 默认显示搜索图标,
              // Tween(开始1,结束0)
              // Interval时间为0-0.5之间
              //
              // 搜索图标开始为1.0显示,结束时0.0隐藏,时间从0.0开始,到0.5结束
              // 关闭图标开始为0.0隐藏,结束时1.0显示,时间从0.5开始,到1.0结束
              ScaleTransition(
                scale: _controller.drive(Tween(begin: 1.0,end: 0.0).chain(CurveTween(curve: const Interval(0.0, 0.5)))),
                child: Icon(Icons.search,size: 40,),
              ),
              ScaleTransition(
                scale: _controller.drive(Tween(begin: 0.0,end: 1.0).chain(CurveTween(curve: Interval(0.5, 1)))),
                child: const Icon(Icons.close,size: 40,),
              ),
            ],
          ),
          ElevatedButton(onPressed: (){
            _controller.forward();
          }, child: const Text('播放')),
          ElevatedButton(onPressed: (){
            _controller.reverse();
          }, child: const Text('返回')),
        ],
      ),
    );
  }
}
相关推荐
恋猫de小郭1 天前
Flutter 2026 Roadmap 发布,未来计划是什么?
android·前端·flutter
空白诗1 天前
Harmony Flutter 跨平台开发实战:鸿蒙与音乐律动艺术、分形几何与自相似性:无限细节的数学之美
flutter
松叶似针1 天前
Flutter三方库适配OpenHarmony【doc_text】— OpenHarmony 插件工程搭建与配置文件详解
flutter
阿林来了1 天前
Flutter三方库适配OpenHarmony【flutter_web_auth】— OAuth2 协议基础与认证流程拆解
flutter
早點睡3901 天前
Harmony Flutter 跨平台开发实战:鸿蒙与音乐律动艺术、贝塞尔流体律动:三阶贝塞尔曲线的“呼吸“感
flutter
2501_921930831 天前
进阶实战 Flutter for OpenHarmony:响应式状态机系统 - 复杂状态流转实现
flutter
松叶似针1 天前
Flutter三方库适配OpenHarmony【doc_text】— Word 文档格式深度科普:从 OLE2 到 OOXML
flutter·harmonyos
空白诗1 天前
Harmony Flutter 跨平台开发实战:鸿蒙与音乐律动艺术、粒子系统与流体模拟:动态粒子的视觉盛宴
flutter·harmonyos
空白诗1 天前
Harmony Flutter 跨平台开发实战:鸿蒙与音乐律动艺术、混沌理论与奇异吸引子:从洛伦兹到音乐的动态艺术
flutter·harmonyos
2501_921930831 天前
进阶实战 Flutter for OpenHarmony:高性能列表虚拟化系统 - 大数据量渲染优化实现
flutter