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

标签:Flutter,动画
0
投稿

猜你喜欢

  • SimpleCommand实现图片下载(二)

    2023-05-21 00:25:17
  • Java注解之Elasticsearch的案例详解

    2022-03-30 12:28:58
  • SpringBoot Redis用注释实现接口限流详解

    2022-03-15 17:40:55
  • 详解java中接口与抽象类的区别

    2021-09-12 03:21:39
  • Java编程Nashorn实例代码

    2022-07-30 05:28:21
  • Android系统自带分享图片功能

    2022-08-03 09:14:07
  • JAVA简单工厂模式(从现实生活角度理解代码原理)

    2021-10-29 12:39:32
  • C#中改变DataGridView控件边框颜色的方法

    2022-07-20 06:00:46
  • Java 8 Stream操作类型及peek示例解析

    2021-07-17 20:42:08
  • WinForm实现为TextBox设置水印文字功能

    2023-06-09 21:15:38
  • Android选项菜单用法实例分析

    2022-11-02 07:42:44
  • 详解Android中提示对话框(ProgressDialog和DatePickerDialog和TimePickerDialog&PopupWindow)

    2023-05-10 19:27:43
  • Android如何禁止向EditText控件中输入内容详解

    2021-07-29 05:01:11
  • Android 文件存储及常见问题解决

    2023-07-12 13:25:45
  • Android AutoCompleteTextView连接数据库自动提示的方法(附demo源码下载)

    2023-09-23 14:53:20
  • SpringBoot整合ElasticSearch实践

    2023-02-05 06:02:08
  • java实现ip地址与十进制数相互转换

    2022-08-10 17:39:31
  • Java元注解meta-annotation和依赖注入详解

    2023-12-23 02:07:00
  • C#操作CSV文件类实例

    2023-04-29 13:49:44
  • Android TextView中文字通过SpannableString设置属性用法示例

    2023-07-26 07:11:51
  • asp之家 软件编程 m.aspxhome.com