这篇文章主要为大家详细介绍了Flutter进阶之实现动画效果第六篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在上一篇文章中,我们之前对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的条件逻辑中,实现我们想要的高效率。换一个角度来看,不知道大家有没有发现,现在代码的可维护性已经不如上一个版本了。这就是为什么之前选择看起来效率较低的解决方案。在性能与可维护性之间选择,需要通过衡量之后再作出决定。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:Flutter进阶之实现动画效果(六)
基础教程推荐
猜你喜欢
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- Flutter进阶之实现动画效果(三) 2022-10-28
- IOS获取系统相册中照片的示例代码 2023-01-03
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Android开发Compose集成高德地图实例 2023-06-15
- Android实现短信验证码输入框 2023-04-29
- iOS开发使用XML解析网络数据 2022-11-12
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- iOS开发 全机型适配解决方法 2023-01-14