当前位置: 首页 > news >正文

Flutter_学习记录_动画的简单了解

AnimationController简单实现如下的效果图:
在这里插入图片描述

1. 只用AnimationController实现简单动画

1.1 完整代码案例

import 'package:flutter/material.dart';class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});State<AnimationDemo> createState() => _AnimationDemoState();
}class _AnimationDemoState extends State<AnimationDemo> with TickerProviderStateMixin {late AnimationController animationDemoController;void initState() {super.initState();animationDemoController = AnimationController(vsync: this,// 初始值,要在 lowerBound 和 upperBound 之间value: 32.0,// 最小值lowerBound: 32.0,// 最大值upperBound: 100.0,// 设置动画的时间duration: Duration(milliseconds: 3000));animationDemoController.addListener((){// 更新页面setState(() {});});// 添加status的监听animationDemoController.addStatusListener((AnimationStatus status){print(status);});}void dispose() {super.dispose();// 销毁 animationDemoControlleranimationDemoController.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("AnimationDemo"),),body: Center(child: IconButton(icon: Icon(Icons.favorite),iconSize: animationDemoController.value,onPressed: (){switch (animationDemoController.status) {case AnimationStatus.completed:// 反转动画animationDemoController.reverse();break;default:// 开始动画animationDemoController.forward();}},),),);}
}

1.2 代码说明

(1) AnimationController

  • animationDemoController 是动画的核心控制器。
  • duration 定义了动画的持续时间(例如 2 秒)。
  • vsync 参数确保动画与屏幕刷新同步,避免资源浪费。
  • value 设置初始值。
  • lowerBound 设置最小值。
  • upperBound 设置 最大值。

(2) addListener 添加监听,可以监听到 animationDemoController.value的值的变化。

  • 如果需要需要用到 animationDemoController.value的值更新UI,则需要调用 setState的方法。
animationDemoController.addListener((){// 更新页面setState(() {});});

(3)addStatusListener 添加动画状态的监听,只有添加了这个监听,才能在后面获取到动画状态的变化。

            switch (animationDemoController.status) {case AnimationStatus.completed:// 反转动画animationDemoController.reverse();break;default:// 开始动画animationDemoController.forward();}

(4) 开始动画

animationDemoController.forward()

(5)反转动画

animationDemoController.reverse();

2. 用AnimationControllerAnimation实现简单动画

2.1 完整代码示例

import 'package:flutter/material.dart';class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});State<AnimationDemo> createState() => _AnimationDemoState();
}class _AnimationDemoState extends State<AnimationDemo> with TickerProviderStateMixin {late AnimationController animationDemoController;late Animation animation;late Animation animationColor;// 设置动画取消late CurvedAnimation curve;void initState() {super.initState();animationDemoController = AnimationController(vsync: this,// 设置动画的时间duration: Duration(milliseconds: 3000));animation = Tween(begin: 32.0, end: 100.0).animate(animationDemoController);animationColor = ColorTween(begin: Colors.red, end: Colors.green).animate(animationDemoController);animationDemoController.addListener((){// 更新页面setState(() {});});// 添加status的监听animationDemoController.addStatusListener((AnimationStatus status){print(status);});}void dispose() {super.dispose();// 销毁 animationDemoControlleranimationDemoController.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("AnimationDemo"),),body: Center(child: IconButton(icon: Icon(Icons.favorite),iconSize: animation.value,color: animationColor.value,onPressed: (){switch (animationDemoController.status) {case AnimationStatus.completed:// 反转动画animationDemoController.reverse();break;default:// 开始动画animationDemoController.forward();}},),),);}
}

2.2 代码说明

(1) Tween

  • Tween(begin: xx, end:xx) 定义了动画的范围:
  • begin 是起始值。
  • end 是结束值。

(2) animationDemoController.value animation.value 来替代

3. 用AnimationControllerAnimationCurvedAnimation实现简单动画

CurvedAnimation 可以添加缓动效果(如 Curves.easeInOut),完整代码示例:

import 'package:flutter/material.dart';class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});State<AnimationDemo> createState() => _AnimationDemoState();
}class _AnimationDemoState extends State<AnimationDemo> with TickerProviderStateMixin {late AnimationController animationDemoController;late Animation animation;late Animation animationColor;// 设置动画曲线late CurvedAnimation curve;void initState() {super.initState();animationDemoController = AnimationController(vsync: this,// 设置动画的时间duration: Duration(milliseconds: 3000));curve = CurvedAnimation(parent: animationDemoController, curve: Curves.bounceOut);animation = Tween(begin: 32.0, end: 100.0).animate(curve);animationColor = ColorTween(begin: Colors.green, end: Colors.red).animate(curve);animationDemoController.addListener((){// 更新页面setState(() {});});// 添加status的监听animationDemoController.addStatusListener((AnimationStatus status){print(status);});}void dispose() {super.dispose();// 销毁 animationDemoControlleranimationDemoController.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("AnimationDemo"),),body: Center(child: IconButton(icon: Icon(Icons.favorite),iconSize: animation.value,color: animationColor.value,onPressed: (){switch (animationDemoController.status) {case AnimationStatus.completed:// 反转动画animationDemoController.reverse();break;default:// 开始动画animationDemoController.forward();}},),),);}
}

4 用AnimationControllerAnimatedWidget实现简单动画

完整代码实例:

import 'package:flutter/material.dart';class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});State<AnimationDemo> createState() => _AnimationDemoState();
}class _AnimationDemoState extends State<AnimationDemo> with TickerProviderStateMixin {late AnimationController animationDemoController;late Animation animation;late Animation animationColor;// 设置动画曲线late CurvedAnimation curve;void initState() {super.initState();animationDemoController = AnimationController(vsync: this,// 设置动画的时间duration: Duration(milliseconds: 3000));curve = CurvedAnimation(parent: animationDemoController, curve: Curves.bounceOut);animation = Tween(begin: 32.0, end: 100.0).animate(curve);animationColor = ColorTween(begin: Colors.green, end: Colors.red).animate(curve);// 添加status的监听animationDemoController.addStatusListener((AnimationStatus status){print(status);});}void dispose() {super.dispose();// 销毁 animationDemoControlleranimationDemoController.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("AnimationDemo"),),body: Center(//  AnimationHeart 是基于 AnimatedWidget 创建的child: AnimationHeart(animations: [animation, animationColor], controller: animationDemoController),),);}
}// 基于 AnimatedWidget 创建 AnimationHeart的控件
class AnimationHeart extends AnimatedWidget {final List animations;final AnimationController controller;const AnimationHeart({super.key, required this.animations, required this.controller}) : super(listenable: controller);Widget build(BuildContext context) {return IconButton(icon: Icon(Icons.favorite),iconSize: animations[0].value,color: animations[1].value,onPressed: (){switch (controller.status) {case AnimationStatus.completed:// 反转动画controller.reverse();break;default:// 开始动画controller.forward();}},);}
}

相关文章:

Flutter_学习记录_动画的简单了解

用AnimationController简单实现如下的效果图&#xff1a; 1. 只用AnimationController实现简单动画 1.1 完整代码案例 import package:flutter/material.dart;class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});overrideState<AnimationDe…...

【java】for (int num : numbers) { System.out.print(num + “ “); } for里的是什么意思

for (int num : numbers) 是 Java 中的一种 增强型 for 循环&#xff08;也称为 for-each 循环&#xff09;。它的作用是遍历数组或集合中的每一个元素&#xff0c;并对每个元素执行循环体中的操作。 1. 增强型 for 循环的语法 java Copy for (元素类型 变量名 : 数组或集合…...

内容中台驱动企业CMS架构优化与高效策略

内容概要 在数字化转型浪潮中&#xff0c;企业内容管理系统&#xff08;CMS&#xff09;正面临从单一内容存储向智能化、协同化方向演进的迫切需求。通过引入内容中台架构&#xff0c;企业能够有效整合元数据管理、版本控制与智能协作能力&#xff0c;从而优化传统CMS的底层逻…...

我用 Cursor 开发了一款个人小记系统

https://note.iiter.cn 项目背景 在日常工作和学习中,我们经常需要快速记录一些想法、收藏一些有用的链接或者保存一些重要的文本、图片内容。虽然市面上已经有很多笔记软件,但我想要一个更轻量、更简单的工具,专注于快速记录和智能检索。于是我开发了这款个人小记系统。 系统…...

百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中

百问网(100ask)提供的烧写工具的原理 具体的实现原理见链接 http://wiki.100ask.org/100ask_imx6ull_tool 为了防止上面这个链接失效&#xff0c;我还对上面这个链接指向的页面保存成了mhtml文件&#xff0c;这个mhtml文件的百度网盘下载链接&#xff1a; https://pan.baidu.c…...

doris:异步物化视图概述

物化视图作为一种高效的解决方案&#xff0c;兼具了视图的灵活性和物理表的高性能优势。 它能够预先计算并存储查询的结果集&#xff0c;从而在查询请求到达时&#xff0c;直接从已存储的物化视图中快速获取结果&#xff0c;避免了重新执行复杂的查询语句所带来的开销。 使用场…...

图像缩放的双线性插值实现方式

1、双线性插值概念 双线性插值是一种用于在二维网格上进行插值的方法&#xff0c;适用于图像处理、计算机图形学等领域。它通过利用四个邻近点的已知值&#xff0c;估算出任意点的值。双线性插值在两个方向&#xff08;通常是水平和垂直&#xff09;上分别进行线性插值&#x…...

深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石

深入剖析 Vue 的响应式原理&#xff1a;构建高效 Web 应用的基石 在前端开发的广阔天地里&#xff0c;Vue.js 凭借其简洁易用的特性和强大的功能&#xff0c;成为众多开发者的心头好。其中&#xff0c;响应式原理作为 Vue 的核心亮点之一&#xff0c;让数据与视图之间实现了高…...

40.日常算法

1.无重复字符的最长子串 题目来源 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 class Solution { public:int lengthOfL…...

CAS单点登录(第7版)11.SSO SLO

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; SSO & SLO 安装IDEA Download IntelliJ IDEA – The IDE for Professional Development in Java and Kotlin 安装Maven Download Apache Maven – Maven MAVEN_HOMED:\apache-maven…...

Bob the Canadian

1&#xff1a;around the house Hi! Bob the Canadian here! Let’s learn English around the house. Come on in! Hi, Bob the Canadian here. Welcome to this video. If this is your first time here, don’t forget to click the subscribe button below, and give…...

CAS单点登录(第7版)16.模仿

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 模仿 概述 代理身份验证 代理身份验证&#xff08;模拟&#xff09;&#xff0c;有时称为 Web 的 sudo&#xff0c;是代表其他用户进行身份验证的能力。 在这种情况下&#xff0c;两个参…...

预留:大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)

传送门目录 前期准备 一、JDK的安装 1、安装jdk 2、配置Java环境变量 3、加载环境变量 4、进行校验 二、hadoop的集群搭建 1、hadoop的下载安装 2、配置文件设置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置hdfs-site.xml 2.4. 配置 yarn-site.xm…...

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…...

C++演示中介模式

避免两个模块之间的耦合&#xff0c;使用中介模式解决。下面是C代码 #include <iostream> #include <vector>using namespace std;class client;//中介 class mediator { public:void addclient(client* client) {clientVec.push_back(client);}void send(const s…...

Vue的简单入门 一

声明&#xff1a;本版块根据B站学习&#xff0c;创建的是vue3项目&#xff0c;用的是vue2语法风格&#xff0c;仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…...

【免费送书活动】《MySQL 9从入门到性能优化(视频教学版)》

本博主免费赠送读者3本书&#xff0c;书名为《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》。 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 这本书已经公开…...

export default与export区别

1.定义&#xff1a; export default‌&#xff1a;用于导出模块中的默认成员。一个模块中只能有一个export default&#xff0c;通常用于导出模块的主要功能或对象。导入时可以使用任意名称&#xff0c;因为它没有具体的名称‌ ‌export‌&#xff1a;用于导出模块中的多个成…...

最佳的出牌方法

最佳的出牌方法 真题目录: 点击去查看 E 卷 200分题型 题目描述 手上有一副扑克牌,每张牌按牌面数字记分(J=11,Q=12,K=13,没有大小王),出牌时按照以下规则记分: 出单张,记牌面分数,例如出一张2,得分为2出对或3张,记牌面分数总和再x2,例如出3张3,得分为(3+3+3)x2=1…...

Kotlin 2.1.0 入门教程(二十一)数据类

数据类 数据类主要用于存储数据。 对于每个数据类&#xff0c;编译器会自动生成一些额外的成员函数&#xff0c;这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。 数据类使用 data 关键字标记&#xff1a; data class User(val name: String, val age: Int…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...