Flutter进阶之实现动画效果(六)
作者:何小有 发布时间:2023-09-15 15:13:50
在上一篇文章中,我们之前对BarChart.lerp的定义并不是高效的,我们正在创建的Bar实例,仅作为Bar.lerp的参数给出,并且针对动画参数t的每个值重复出现。每秒60帧,这意味着可能很多Bar实例被送到垃圾收集器,即使是相对较短的动画。
我们可以采用以下三种解决方案:
Bar实例可以通过在Bar类中仅创建一次而不是每次调用collapsed来重复使用,但这种方法不适合我们的应用程序。
重用可以通过BarChartTween来处理,通过使其构造函数创建一个列表_tween的BarTween实例,在创建补间条形图时使用(i) => _tweens[i].lerp(t)。这种方法破坏了使用静态方法lerp的惯例,静态BarChart.lerp中没有涉及到任何对象,用于在动画持续时间内存储补间列表。相反,BarChartTween对象完全适合这一点。
假设Bar.lerp中有合适的条件逻辑,可以使用null来表示折叠条,这种方法是非常高效的,但是需要注意避免引用或误解null。null常用在Flutter SDK中,其中静态方法lerp会将null视为动画终点,通常将其解释为某种不可见元素,比如完全透明的颜色或零尺寸的图形元素。在我们的代码中,lerpDouble将null视为零,除非两个动画结束点都为null。
综合考虑之下,我们使用最后一种解决方案,首先我们需要更新BarChart的部分代码。
class BarChart {
// ...
static BarChart lerp(BarChart begin, BarChart end, double t) {
final barCount = max(begin.bars.length, end.bars.length);
final bars = new List.generate(
barCount,
(i) => Bar.lerp(begin._barOrNull(i), end._barOrNull(i), t)
);
return new BarChart(bars);
}
// ...
}
然后我们还需要更新一下Bar的条件逻辑。
class Bar {
Bar(this.x, this.width, this.height, this.color);
final double x;
final double width;
final double height;
final Color color;
static Bar lerp(Bar begin, Bar end, double t) {
if(begin == null && end == null)
return null;
return new Bar(
lerpDouble((begin??end).x, (end??begin).x, t),
// ?:变量可以为null
lerpDouble(begin?.width, end?.width, t),
lerpDouble(begin?.height, end?.height, t),
Color.lerp((begin??end).color, (end??begin).color, t)
);
}
}
现在我们的应用程序里,如何将使用折叠的条形作为不可见元素的判断,写在Bar.lerp的条件逻辑中,实现我们想要的高效率。换一个角度来看,不知道大家有没有发现,现在代码的可维护性已经不如上一个版本了。这就是为什么之前选择看起来效率较低的解决方案。在性能与可维护性之间选择,需要通过衡量之后再作出决定。
来源:https://blog.csdn.net/hekaiyou/article/details/72765367


猜你喜欢
- 本文实例讲述了Java使用JDBC连接postgresql数据库。分享给大家供大家参考,具体如下:package tool;import j
- 机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄
- 本文实例为大家分享了Android登录界面的注册实现代码,供大家参考,具体内容如 * 册一个登录界面在控制台将输入的信息文本选框展示出来xml
- 本文实例讲述了C# Socket网络编程技巧。分享给大家供大家参考。具体分析如下:客户端要连接服务器:首先要知道服务器的IP地址。而服务器里
- 一、前言关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象。好处嘛,我认为流程上更加清晰即易懂、可读性更好,
- 什么是https要说https我们得先说SSL(Secure Sockets Layer,安全套接层),这是一种为网络通信提供安全及数据完整
- 这篇文章主要介绍了简单了解Java多态向上转型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一、前言在Spring中,事务有两种实现方式:编程式事务管理: 编程式事务管理使用TransactionTemplate可实现更细
- 有些时候我们做的程序需要进度条,而vs提供的控件不是我们想要的。先看效果图:进度条闪烁动画,当然背景可设为Transparent之前想手绘进
- 条码的应用已深入生活和工作的方方面面。在处理条码时,常需要和各种文档格式相结合。当需要在文档中插入、编辑或者删除条码时,可借助于一些专业的类
- 前言这几天琢磨着开发个个人作品的时候,发现原来Unity3D官方没有提供圆锥体的创建功能,就自己做了个编辑器扩展。鉴于之前搜索Mesh编程的
- 需求:有一个列表,列表中有一个edittext(只能输整形),外部有一个整形变量Int,每次改变列表中其中一项的edittext的值时,外部
- 认识链表结构单向链表单链表在内存中的表示:可以看到,一个链表的节点包含数据域和指向下一个节点的引用,链表最后一个节点指向null(空区域)。
- 方式1:dependency 本地jar包<dependency> <groupId>com.jouyp
- 前言C# 时间戳与 标准时间的转其实不难,但需要注意下,基准时间的问题。格林威治时间起点: 1970 年 1 月 1 日的 00:00:00
- 本文实例讲述了Android编程简易实现XML解析的方法。分享给大家供大家参考,具体如下:首先创建在Android工程中创建一个Assets
- 1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。2. 为什么需要规范呢?因为
- 本文实例为大家分享了Android Studio实现简易计算器的具体代码,供大家参考,具体内容如下一、题目1、如图所示(实际设计,类似此界面
- 本文以实例形式分析了C#中Predicate<T>与Func<T, bool>泛型委托的用法,分享给大家供大家参考之
- 前言目前,企业项目的开发过程中,往往会使用配置文件来做一些配置项来实现项目部署的灵活性,避免硬编码的方式在环境变化时需要对代码进行重新编译。