在上一篇文章中,我们之前对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),// ?:变量可以为nulllerpDouble(begin?.width, end?.width, t),lerpDouble(begin?.height, end?.height, t),Color.lerp((begin??end).color, (end??begin).color, t));}
}

现在我们的应用程序里,如何将使用折叠的条形作为不可见元素的判断,写在Bar.lerp的条件逻辑中,实现我们想要的高效率。换一个角度来看,不知道大家有没有发现,现在代码的可维护性已经不如上一个版本了。这就是为什么之前选择看起来效率较低的解决方案。在性能与可维护性之间选择,需要通过衡量之后再作出决定。

未完待续~~~

Flutter进阶—实现动画效果(六)相关推荐

  1. Flutter进阶—实现动画效果(四)

    在上一篇文章:Flutter进阶-实现动画效果(三)中,实现了一个随机高度.颜色的条形.这一篇文章我们会实现多个条形,同样是随机高度.颜色. 首先在bar.dart中创建BarChart类,并使用固定 ...

  2. Flutter进阶—实现动画效果(三)

    在上一篇文章:Flutter进阶-实现动画效果(二)的最后,我们实现了一个控件,其中包含各种布局和状态处理控件.以及使用自定义的动画感知绘图代码绘制单个Bar的控件.还有一个浮动按钮控件,用于启动条形 ...

  3. Flutter进阶—实现动画效果(二)

    在上一篇文章:Flutter进阶-实现动画效果(一)的最后,我们说到需要一个处理程序混乱的概念.在这一篇文章中,我们会引入补间,它是构建动画代码的一个非常简单的概念,主要作用是用面向对象的方法替代之前 ...

  4. Flutter进阶—实现动画效果(一)

    上一篇文章我们了解了Flutter的动画基础:Flutter进阶-解析动画,这一篇文章我们就来实现一个图表的动画效果. 首先,我们需要创建一个新项目myapp,然后把main.dart的内容替换成下面 ...

  5. Flutter进阶—实现动画效果(十)

    前面的两篇文章[动画效果(八).动画效果(九)]中,我们只需要统计产品和地区,如果现在增加一个统计项目--销售渠道,那么使用之前的堆叠条形图和分组条形图都不适合.我们可以将两者结合,使用分组+堆叠条形 ...

  6. Flutter进阶—实现动画效果(八)

    通过学习前面的文章,我们现在终于能为更复杂的图表制作动画效果了[手动斜眼笑].接着上一篇文章讲,如果公司的产品销往全国各地,那么我们的图表要展示的内容就需要加上地区.我们可以使用堆叠条形图来试试效果, ...

  7. Flutter进阶—实现动画效果(七)

    我们假设一种情况,如果应用程序使用条形图显示给定年份的产品类别的销售额,用户可以选择另一年,然后该应用程序将动画到该年的条形图.如果产品类别在两年内是相同的,或者恰好是相同的,除了在其中一个图表中右侧 ...

  8. Flutter进阶—实现动画效果(五)

    在本篇文章开始前,我们先来回顾一下之前我们都做了哪些事情.在第一篇文章中,我们在动画值更改时调用double lerpDouble(num a, num b, double t)重新绘制条形.在第二篇 ...

  9. Flutter进阶—实现动画效果(九)

    在上一篇文章中,我们实现了统计每个产品和地区的销售额,如果现在需要统计每个产品和地区所占市场份额的百分比,那么使用堆叠条形图是不合适的,我们可以使用分组条形图,因为它可以同时在两个类别维度上进行定量比 ...

最新文章

  1. c#中的protected和internal
  2. 在Win7 64位注册ActiveX控件
  3. 改进初学者的PID-积分饱和
  4. python的神经网络模块接法图解_图神经网络库PyTorch geometric
  5. PS网页设计教程XIV——如何创建一个复古风格的PS布局
  6. groupby java_Java8的groupBy实现集合的分组
  7. cisco 设备的NTP客户端设置
  8. HTML不刷新,改数据
  9. Spring源码下载步骤
  10. 试验设计与方差分析的基本原理——以单因素试验为例
  11. 关于MSP430单片机程序烧写的介绍
  12. 25岁从零开始学习平面设计会不会晚
  13. 离散数学-图的运算与基本概念、导出子图、路与连通
  14. ubuntu 安装图片编辑工具pinta
  15. 渗透测试工具网址--自用
  16. Godaddy 主机域名的购买、注册和使用
  17. 数据库课程设计之通讯录管理系统之目录
  18. 家里光猫用管理员权限登录
  19. 【WCN685X】DFS认证5600~5650频宽CAC测试失败问题问题及解决方案
  20. Android安卓——消息提示

热门文章

  1. python数据结构之元组(tuple)——超详细
  2. 火车进出栈问题(高精度+压位+质因数分解消除除法)
  3. 牛客 2021年度训练联盟热身训练赛第二场 B题
  4. 《南溪的目标检测学习笔记》——性能优化的学习笔记
  5. 如何MATLAB中将一个向量或者矩阵强行转换为列向量
  6. C++命名空间的玩法
  7. Jmeter学习笔记(三)文件上传
  8. 尝试笔记 01 之 CSS 边角上的标签
  9. MySQL优化(三):优化数据库对象
  10. 萌新关于C#委托一点见解