并行动画

当多个动画定义同时指向某个组件,并使用动画控制器启动时,就产生了并行动画(Parallel Animation)。例如我们可以让一个组件:

  • 移动的同时改变大小
  • 旋转的同时边界颜色闪烁
  • 圆形图片模糊的同时形状越来越方

总之,掌握了动画原理以后我们知道,只要能将一个动画抽象值与一个组件的某个外观属性值联系起来,那么就能在动画中展现出连续平滑的外观变化。这一点,任何平台(Web、Android)的原理都是一致的。

例子

接前一篇的例子,我们让一个移动的正方形在位移过程中逐渐变为圆形。

在已有的animation基础上,再添加一个新的animation用以控制动画组件的边角半径。

class ParallelDemoState extends State<ParallelDemo> with SingleTickerProviderStateMixin {
...
Tween<double> slideTween = Tween(begin: 0.0, end: 200.0);
Tween<double> borderTween = Tween(begin: 0.0, end: 40.0); // 添加边角半径变动范围
Animation<double> slideAnimation;
Animation<double> borderAnimation; // 添加边角半径动画定义 @override
void initState() {
...
controller = AnimationController(duration: Duration(milliseconds: 2000), vsync: this);
slideAnimation = slideTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear));
borderAnimation = borderTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); // 定义边角半径动画
} ... @override
Widget build(BuildContext context) {
return Container(
width: 200,
alignment: Alignment.centerLeft,
child: Container(
margin: EdgeInsets.only(left: slideAnimation.value),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(borderAnimation.value), // 边角半径的属性上添加动画
color: Colors.blue,
),
width: 80,
height: 80,
),
);
}
}

  

串行动画

串行动画(Sequential Animation)顾名思义,多个动画像肉串一样一个接一个的发生。但这只是从现象上观察出的结果,实际的运行方式和并行动画差别不大。串行动画的关键之处在于,它为每个动画的发生设定了一个计时器,只有到特定时间点时,特定的动画效果才会发生。

例如设计一个3秒钟的动画:

  • 移动动画从0秒开始,持续1秒
  • 旋转动画从1秒开始,持续1.5秒
  • 缩放动画从2秒开始,持续0.7秒

那么,最后的动画效果便是:

  1. 0~1秒,动画元素在移动
  2. 1~2秒,动画元素在旋转
  3. 2~2.5秒,动画既在旋转又在缩放
  4. 2.5~2.7秒,动画在缩放
  5. 2.7~3秒,动画静止不动

例子

在串行动画例子的基础上,我们加上计时器Interval的处理。Interval有三个参数,前两个参数指示了动画的开始和结束时间。这两个参数都是以动画控制器的Duration时长的比例来计算的。例如:

  • Slide动画分别为0.0和0.5,表示动画从0秒(2000ms 0.0)这个时间点开始,至1秒(2000ms 0.5)这个时间点结束
  • Border动画分别为0.5和1.0,表示动画从1秒(2000ms 0.5)这个时间点开始,至2秒(2000ms 1.0)这个时间点结束
class SequentialDemoState extends State<ParallelDemo> with SingleTickerProviderStateMixin {
... @override
void initState() {
...
controller = AnimationController(duration: Duration(milliseconds: 2000), vsync: this);
// slideAnimation = slideTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear));
// borderAnimation = borderTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); // 定义边角半径动画 // 换一种写法,加入Interval
slideAnimation = slideTween.animate(CurveTween(curve: Interval(0.0, 0.5, curve: Curves.linear)).animate(controller));
borderAnimation = borderTween.animate(CurveTween(curve: Interval(0.5, 1.0, curve: Curves.linear)).animate(controller));
} ... @override
Widget build(BuildContext context) {
return Container(
width: 200,
alignment: Alignment.centerLeft,
child: Container(
margin: EdgeInsets.only(left: slideAnimation.value),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(borderAnimation.value), // 边角半径的属性上添加动画
color: Colors.blue,
),
width: 80,
height: 80,
),
);
}
}

  

动画处理<并行和串行>的更多相关文章

  1. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

    返回目录 并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组, ...

  2. activiti并行和串行区别

    多实例还有并行.串行区分.以下解释一下什么是并行与串行 并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响. 串行代表工作或任务由一个人完成后,再由另 ...

  3. Promise的并行和串行

    Promise 并行 这个功能Promise自身已经提供,不是本文的重点.主要是依赖Promise.all和Promise.race. Promise.all是所有的Promise执行完毕后(reje ...

  4. async/await 里的并行和串行

    我们在使用 async/await 语法时,有时会这样用: function getName () { return new Promise((resolve, reject)=>{ setTi ...

  5. 7.JavaScript-Promise的并行和串行

    Promise 并行 Promise.all是所有的Promise执行完毕后(reject|resolve)返回一个Promise对象. 最近在开发一个项目中,需要等接口拿到全部数据后刷新页面,取消l ...

  6. Quarz.net 设置任务并行和任务串行

    如何设置Quarz.net某个任务完成后再继续执行该任务?  Quarz.net 的任务有并行和串行两种: 并行:一个定时任务,当执行时间到了的时候,立刻执行此任务,不管当前这个任务是否在执行中: 串 ...

  7. FS BPM 业余研发(用户详细操作手册--单人串行/并行)之 深圳分公司技术部请假审批流程

    1.FS BPM 简介 BPM软件中BPM是英文字母缩写,大致有二个意思.第一.Business Process Management,即业务流程管理,是一套达成企业各种业 务环节整合的全面管理模式. ...

  8. 串行动画组QSequentialAnimationGroup

    按顺序执行动画 该类就是用来按照动画添加顺序来执行动画的.我们只用实例化该类,然后通过调用addAnimation()或者insertAnimation()方法把各个动画添加进去就可以了 import ...

  9. 自制单片机之十五……可串行驱动LCD12864的应用

    在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864. 买了块S ...

随机推荐

  1. [RoarCTF]Easy Calc

    目录 [RoarCTF]Easy Calc 知识点 1.http走私绕过WAF 2.php字符串解析特性绕过WAF 3.绕过过滤写shell [RoarCTF]Easy Calc 题目复现链接:htt ...

  2. php 调用微信上传临时素材接口 {“errcode”:41005,”errmsg”:”media data missing hint”}

    原因:由于PHP5.6以前与之后的版本curl_setopt有差异.PHP5.6以后不再支持”@文件路径”的方式. $picPath= "public\public\upload\xxx.p ...

  3. Nacos学习

    Nacos是阿里开源的一个新框架,在分布式的架构中,Nacos同时扮演着服务注册中心和配置中心的角色.今天主要讲的是Nacos作为服务注册中心. 分布式中著名的CAP理论,任何一种服务注册中心都只能实 ...

  4. 纯Python模式

    http://crcmod.sourceforge.net/intro.html https://help.aliyun.com/document_detail/85288.html OSS的CRC数 ...

  5. 初探Android逆向:通过游戏APP破解引发的安全思考

    如今移动互联网已经完全融入到我们的生活中,各类APP也是层出不穷,因此对于安卓APP安全的研究也尤为重要.本文通过对一款安卓APP的破解实例,来引出对于APP安全的探讨.(本人纯小白,初次接触安卓逆向 ...

  6. PostMan Request Export

  7. 如何获取select下拉框中option选中的文本值

    $(select的id或者class).change(function(){ $(this).find("option:selected").text() }) 源文:https: ...

  8. 【python基础】argparse模块

    参考 1. argumentparser-objects: 2. argparse.ArgumentParser()用法解析:

  9. 在ObjectARX中创建OPM项目的时候出现 MIDL1012: argument illegal for switch / header错误的解决方式

    修改为 这样新建的带有MIDL项目就不会提示错误这个错误了. 如果你已经建立好项目,可以尝试修改MIDL的配置,头文件可能是.h没有文件名,所以出现MIDL1012错误,修改为项目名称的.h即可,保持 ...

  10. react-redux源码学习

    React-redux 源码学习 version 7.0.3 目录 Provider connect mapStateToProps mapDispatchToProps mergeProps opt ...