Flutter可执行屏幕动画的AnimateView

1.让动画使用起来就像使用widget。

2.可自定义动画。

3.内置平移动画。

演示:

 代码:

import 'dart:math';
import 'package:flutter/cupertino.dart';class AnimateView extends StatefulWidget {///子Widgetfinal Widget child;///动画自定义final IAnimate? animate;///是否需要每次刷新时都执行动画final bool isNeedFlashEveryTime;const AnimateView({super.key,required this.child,this.animate,this.isNeedFlashEveryTime = false,});@overrideState<StatefulWidget> createState() => _AnimateViewState();
}class _AnimateViewState extends State<AnimateView>with TickerProviderStateMixin {late IAnimate animate;late AnimationController controller;late Animation animation;@overridevoid initState() {super.initState();animate = widget.animate ??TranslationAnimate(angle: TranslationAnimateDirection.rightToLeft.angle);animate.init();controller = animate.getAnimationController(this);animation = animate.getAnimation(controller, this);//启动动画(正向执行)controller.forward();}@overridevoid didUpdateWidget(covariant AnimateView oldWidget) {super.didUpdateWidget(oldWidget);if (widget.isNeedFlashEveryTime) {animate = widget.animate ??TranslationAnimate(angle: TranslationAnimateDirection.rightToLeft.angle);animate.init();controller = animate.getAnimationController(this);animation = animate.getAnimation(controller, this);//启动动画(正向执行)controller.forward();}}@overrideWidget build(BuildContext context) {return animate.animate(context, widget.child, animation, controller);}
}///动画抽象类。
///实现该类,定制自己的动画。
abstract class IAnimate {///初始化void init();///获取AnimationControllerAnimationController getAnimationController(TickerProvider provider);///获取AnimationAnimation getAnimation(AnimationController controller, State<StatefulWidget> state);///定制自己的动画,每一个item都会调用到animate,///[widget] 执行动画之后的widget///[index] 列表的item的indexWidget animate(BuildContext context,Widget widget,Animation animation,AnimationController controller,);
}///平移动画
class TranslationAnimate extends IAnimate {///动画执行的总长度static double gap = 1000.0;///动画执行角度final int angle;///动画执行时长,毫秒(ms)final int duration;///进入动画还是出去动画final TranslationAnimateType type;///界面的宽,动画需要根据你需要操作的界面宽进行计算,不传代表屏幕宽final double? width;///界面的高,动画需要根据你需要操作的界面高进行计算,不传代表屏幕高final double? height;TranslationAnimate({this.angle = 0,this.duration = 500,this.type = TranslationAnimateType.translateIn,this.width,this.height,});@overrideWidget animate(BuildContext context, Widget widget, Animation animation,AnimationController controller) {final size = MediaQuery.of(context).size;double width = this.width ?? size.width;double height = this.height ?? size.height;double left = 0;double top = 0;///范围0.0->1000.0double animateValue = animation.value;int positiveAngle = angle;if (angle < 0) {int tempAngle = angle % 360;positiveAngle = 360 - tempAngle;}positiveAngle = positiveAngle % 360;///范围0->1double rate = animateValue / gap;if (type == TranslationAnimateType.translateIn) {rate = rate - 1;}if (positiveAngle >= 0 && positiveAngle <= 45 ||positiveAngle >= 135 && positiveAngle <= 225 ||positiveAngle > 315 && positiveAngle <= 360) {///移出距离以宽度为准left = rate * width;if (positiveAngle > 90 && positiveAngle < 270) {left = -left;}double tanValue = tan(positiveAngle * pi / 180);top = rate * width * tanValue;} else if (positiveAngle == 90) {top = rate * height;left = 0;} else if (positiveAngle == 270) {top = -rate * height;left = 0;} else {///移出距离以高度为准top = rate * height;if (positiveAngle > 180 && positiveAngle < 360) {top = -top;}double tanValue = tan(positiveAngle * pi / 180);if (tanValue == 0) {left = 0;} else {left = rate * height / tanValue;}}//print("angle=$positiveAngle");//print("left=$left");//print("top=$top");return Container(transform: Matrix4.translationValues(left, top, 0),child: widget,);}@overrideAnimation getAnimation(AnimationController controller, State<StatefulWidget> state) {return Tween(begin: 0.0, end: gap).animate(controller)..addListener(() {if (state.mounted) {state.setState(() {});}});}@overrideAnimationController getAnimationController(TickerProvider provider) {return AnimationController(duration: Duration(milliseconds: duration), vsync: provider);}@overridevoid init() {}
}///平移动画执行方向枚举
enum TranslationAnimateDirection {///从下往上bottomToTop(90),///从上往下topToBottom(270),///从左往右leftToRight(0),///从右往左rightToLeft(180);///动画执行方向度数final int angle;const TranslationAnimateDirection(this.angle);
}///位移动画类型
enum TranslationAnimateType {///出去动画translateOut,///进入动画translateIn
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/57673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML-常见标签、HTML5新特性

HTML 软件架构 1.C/S架构 (1) C/S架构即Client/Server&#xff08;客户机/服务器&#xff09;结构。 (2) C/S 架构特点 ​ C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是…

ssm会议管理系统源码和论文

ssm会议管理系统源码和论文087 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&…

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

前言 基于我个人的工作内容和兴趣&#xff0c;想要在家里搞一套服务器集群&#xff0c;用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器&#xff0c;比如 Dell R730, 还搞了一套配置清单&#xff0c;如下&#xff1a; Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…

MySQL----索引

一、索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于c语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该…

Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)

MVCC到底是什么 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种并发控制机制&#xff0c;用于解决并发访问数据库时的数据一致性和隔离性问题。MVCC允许多个事务同时读取数据库的同一数据&#xff0c;而不会相互干扰或导致冲突。 在传统的并发控制机制中…

基于Spring实现博客项目

访问地址:用户登录 代码获取:基于Spring实现博客项目: Spring项目写博客项目 一.项目开发 1.项目开发阶段 需求评审,需求分析项目设计(接口设计,DB设计等&#xff0c;比较大的需求,需要设计流程图&#xff0c;用例图,UML, model中的字段)开发&#xff0b;自测提测(提交测试…

DOM破坏绕过XSSfilter例题

目录 一、什么是DOM破坏 二、例题1 三、多层关系 1.Collection集合方式 2.标签关系 3.三层标签如何获取 四、例题2 五、例题3 1.代码审计 2.payload分析 一、什么是DOM破坏 DOM破坏&#xff08;DOM Clobbering&#xff09;指的是对网页上的DOM结构进行不当的修改&am…

计算机网络MTU和MSS的区别

在计算机网络中&#xff0c;MTU代表最大传输单元&#xff08;Maximum Transmission Unit&#xff09;&#xff0c;而MSS代表最大分节大小&#xff08;Maximum Segment Size&#xff09;。 1.MTU&#xff08;最大传输单元&#xff09;&#xff1a; MTU是指在网络通信中&#x…

网络服务第二次作业

[rootlocalhost ~]# vim /etc/httpd/conf.d/vhosts.conf <Virtualhost 192.168.101.200:80> #虚拟主机IP及端口 DocumentRoot /www/openlab #网页文件存放目录 ServerName www.openlab.com #服务器域名 </VirtualHost> …

易云维®FMCS厂务系统创造工厂全新的“数字低碳智能”应用场景

近年来&#xff0c;新一代信息技术的高速发展为传统工业与制造业领域带来了新的机遇。信息技术加持下的制造技术发展出了新的生产方式、产业形态与管理模式。通过搭建FMCS厂务系统进行数字化转型来实现数据互联互通与业务高效协同&#xff0c;助力企业向安全、绿色、节能、高效…

上海港股通开通条件是什么?港股通交易佣金最低多少?

上海港股通权限开通条件有&#xff1a; 1、申请权限开通前20个交易日证券账户日均资产不低于50万元; 2、进行港股知识测试&#xff0c;且测试分数不低于80分; 3、风险承受能力等级需要匹配&#xff0c;无投资经验期限的门槛 港股通的股票范围是香港联合交易所恒生综合大型股…

MATLAB图论合集(二)计算最小生成树

今天来介绍第二部分&#xff0c;图论中非常重要的知识点——最小生成树。作为数据结构的理论知识&#xff0c;Prim算法和克鲁斯卡尔算法的思想此处博主不详细介绍&#xff0c;建议在阅读本帖前熟练掌握。 对于无向带权图&#xff0c;在MATLAB中可以直接以邻接矩阵的方式创建出来…

Flutter实现StackView

1.让界面之间可以嵌套且执行动画。 2.界面的添加遵循先进后出原则。 3.需要使用AnimateView&#xff0c;请看我上一篇博客。 演示&#xff1a; 代码&#xff1a; Stack: import package:flutter/cupertino.dart;///栈&#xff0c;先进后出 class KqWidgetStack {final Lis…

JVM知识点(一)

1、JVM基础概念 &#xff08;1&#xff09;JVM、JRE、JDK JRE&#xff1a;JVM基本类库组成的运行环境就是JRE。JVM自己是无法完成一次编译&#xff0c;处处运行的&#xff0c;需要有一个基本类库告诉JVM如何操作运行&#xff0c;如如何操作文件&#xff0c;连接网络等&#x…

华为OD机试 - MELON的难题 - 动态规划(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、动态规划五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 MELON有一堆精美的雨花石(数量为n&#xff0c;重量各异)&#xff0c;准备送给…

类和对象(上)

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

Zblog博客网站搭建与上线发布:在Windows环境下利用cpolar内网穿透实现公网访问的指引

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

RHCE——十一、NFS服务器

NFS服务器 一、简介1、NFS背景介绍2、生产应用场景 二、NFS工作原理1、示例图2、流程 三、NFS的使用1、安装2、配置文件3、主配置文件分析3.1 实验1 4、NFS账户映射4.1 实验24.2 实验3 四、autofs自动挂载服务1、产生原因2、安装3、配置文件分析4、实验45、实验5 一、简介 1、…

算法通关村十三关 | 进制转换问题处理模板

1. 七进制数 题目&#xff1a;LeetCode504&#xff1a;504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 思路 进制转换&#xff0c;对几转换就是对几求余&#xff0c;最后将所有的余数反过来即可、如果num< 0&#xff0c;先取绝对值&#xff0c;再进行操作。 100转7…