基于Flutter实现爱心三连动画效果
作者:岛上码农 发布时间:2023-09-02 03:38:36
前言
我们开始 Flutter 动画相关篇章之旅,在应用中通过动效能够给用户带来更愉悦的体验,比较典型的例子就是一些直播平台的动效了,比如送火箭能做出来那种火箭发射的动效——感觉倍有面子,当然这是土豪的享受,我等码农只在视频里看过。本篇我们来介绍基于 Animation 类实现的基本动画构建。
Animation 简介
Animation
是一个抽象类,它并不参与屏幕的绘制,而是在设定的时间范围内对一段区间值进行插值。插值的方式可以是线性、曲线、一个阶跃函数或其他能够想到的方式。这个类的对象能够知道当前的值和状态(完成或消失)。Animation 类提供了一个监听回调方法,当它的值改变的时候,就会调用该方法:
@override
void addListener(VoidCallback listener);
因此,在监听回调里,我们可以来刷新界面,通过Animation
对象最新的值控制 UI 组件的位置、尺寸、角度,从而实现动画的效果。Animation
类通常会和 AnimationController
一起使用。
AnimationController 简介
AnimationController
是一个特殊的 Animation
类,它继承自 Animation<double>
。每当硬件准备好绘制下一帧时,AnimationController
就会产生一个新的值。默认情况下 AnimationController
会在给定的时间范围内产生的值是从0到1.0的线性序列值(通常60个值/秒,以达到60 fps的效果)。例如,下面的代码构建一个时长为2秒的 AnimationController
。
var controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
AnimationController
具有 forward
,reverse
等控制动画的方法,通常用于控制动画的开始和恢复。
连接 Animation
和 AnimationController
的是 Animatable
类,该类也是一个抽象类, 常用的的实现类包括 Tween<T>
(线性插值),CurveTween
(曲线插值)。Animatable
类有一个 animate
方法,该方法接收 Animation<double>
类参数(通常是 AnimationController
),并返回一个 Animation
对象。
Animation<T> animate(Animation<double> parent) {
return _AnimatedEvaluation<T>(parent, this);
}
animate
方法使用给定的 Animation<double>
对象驱动完成动效,但使用的值的范围是自身的值,从而可以构建自定义值范围的动效。比如,要构建一个2秒内从0增长100的动效值,可以使用如下的代码。
var controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
var animation = Tween<double>(begin: 0, end: 100).animate(controller);
应用 - 爱心三连
有了上面的基础,我们就可以开始牛刀小试了,我们先来一个爱心三连放大缩小的动效,如下所示,首次点击逐渐放大,再次点击逐渐缩小恢复到原样。
界面代码很简单,三个爱心其实就是使用Stack
将三个不同颜色的爱心 Icon
组件叠加在一起,然后通过 Animtion
对象的值改变 Icon
的大小。在 Animation
值变化的监听回调里使用 setState
刷新界面就好了。完整代码如下:
import 'package:flutter/material.dart';
class AnimtionDemo extends StatefulWidget {
const AnimtionDemo({Key? key}) : super(key: key);
@override
_AnimtionDemoState createState() => _AnimtionDemoState();
}
class _AnimtionDemoState extends State<AnimtionDemo>
with SingleTickerProviderStateMixin {
late Animation<double> animation;
late AnimationController controller;
@override
void initState() {
super.initState();
controller =
AnimationController(duration: const Duration(seconds: 1), vsync: this);
animation = Tween<double>(begin: 40, end: 100).animate(controller)
..addListener(() {
setState(() {});
});
controller.addStatusListener((status) {
print(status);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Animation 动画'),
),
body: Center(
child: Stack(
alignment: Alignment.center,
children: [
Icon(
Icons.favorite,
color: Colors.red[100],
size: animation.value * 1.5,
),
Icon(
Icons.favorite,
color: Colors.red[400],
size: animation.value,
),
Icon(
Icons.favorite,
color: Colors.red[600],
size: animation.value / 2,
),
],
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.play_arrow, color: Colors.white),
onPressed: () {
if (controller.status == AnimationStatus.completed) {
controller.reverse();
} else {
controller.forward();
}
},
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
这里需要提的是在_AnimtionDemoState
中混入了SingleTickerProviderStateMixin
,这里其实是为 AnimationController
提供了一个 TickerProivder
对象。TickerProivder
对象会在每一帧刷新前触发一个 onTick
回调,从而实现AnimationController
的值更新。
来源:https://mp.weixin.qq.com/s/mXlzBh0OoLvgHIFYt-kASg


猜你喜欢
- 1、python的每一个语句的后面可以添加分号也可以不添加分号;在一行有多条语句的时候,必须使用分号加以区分2、查看Python版本号,在D
- 依赖让我们先把 zip4j 依赖关系添加到我们的 pom.xml 文件中。<dependenc
- 好久就想着好好搭建一个ssm框架,自己以后用也方便吧,但是最近的事真的是很多,很多事情都没有去干,有时候自己会怀疑一下人生自己该不该去做程序
- 这里设计一个自定义View,继承了ScrollView,实现可以下拉里面的内容,松手后画面弹回,这个自定义的View可以当做ScrollVi
- c++智能指针介绍由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有
- 本文将介绍如何在spring boot中集成ehcache作为hibernate的二级缓存。各个框架版本如下spring boot:1.4.
- 本文实例讲述了Android中AlertDialog显示简单和复杂列表的方法。分享给大家供大家参考,具体如下:AlertDialog 显示简
- 背景项目中经常会用到消息推送功能,关于推送技术的实现,我们通常会联想到轮询、comet长连接技术,虽然这些技术能够实现,但是需要反复连接,对
- 在JAVA中通过synchronized语句可以实现多线程并发。使用同步代码块,JVM保证同一时间只有一个线程可以拥有某一对象的锁。锁机制实
- 上一篇:C# Redis学习系列一:Redis的认识、下载、安装、使用一.redis 设置密码使用下载好的 redis-cli.exe指令:
- 相信有些同学跟我一样,曾经对这个问题很疑惑。在网上也看了一些别人说的观点,评论不一。有说有值传递和引用传递两种,也有说只有值传递的,这里只说
- 一、前言(吐槽+煽情+简介) &n
- 假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,
- 工作中许多代码中用到枚举(enum),更用到了需要继承的枚举,由于C#的枚举不允许被继承(但允许继承自int/float等类型,这个不是我要
- 在现在的项目中,较多的使用到二维码,前面介绍过一篇使用Gma生成二
- 由于今天用Security进行权限管理的时候出现了一些Bug,特此发这篇博客来补习一下对SpringSecurity的理解前言引入当今市面上
- 需求分析需求一:图片列表查询,从后台返回数据,将数据展示在页面上需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印说明:此次案例的
- 本文实例讲述了C#使用IComparer自定义List类实现排序的方法。分享给大家供大家参考。具体如下:List类中不带参数的Sort函数可
- Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用简单复习
- 突然学到了,所以就放到博客上来共享一下,权当是学习日记吧。首先说明一下,数组是引用类型的,所以注意不要在复制时复制了地址而没有复制数值哦!其