在上一篇文章:Flutter进阶—实现动画效果(二)的最后,我们实现了一个控件,其中包含各种布局和状态处理控件。以及使用自定义的动画感知绘图代码绘制单个Bar的控件。还有一个浮动按钮控件,用于启动条形图高度的动画变化。
现在开始向我们的单个条形添加颜色,在Bar类的height字段下添加一个color字段,并且更新Bar.lerp以使其两者兼容。在上一篇文章中,介绍过“lerp”是“线性内插”或“线性插值”的一种简短形式。
class Bar { Bar(this.height, this.color); final double height; final Color color; static Bar lerp(Bar begin, Bar end, double t) { return new Bar( lerpDouble(begin.height, end.height, t), Color.lerp(begin.color, end.color, t) ); } }
要在我们的应用程序中使用彩色条形,需要更新BarChartPainter以从Bar获取条形颜色。
class BarChartPainter extends CustomPainter { // ... @override void paint(Canvas canvas, Size size) { final bar = animation.value; final paint = new Paint() // 从Bar获取条形颜色 ..color = bar.color ..style = PaintingStyle.fill; // ... // ... }
在main.dart同级目录下新建color_palette.dart文件,用于获取颜色。
import 'package:flutter/material.dart'; import 'dart:math'; class ColorPalette { static final ColorPalette primary = new ColorPalette(<Color>[ Colors.blue[400], Colors.red[400], Colors.green[400], Colors.yellow[400], Colors.purple[400], Colors.orange[400], Colors.teal[400], ]); ColorPalette(List<Color> colors) : _colors = colors { // bool isNotEmpty:如果此集合中至少有一个元素,则返回true assert(colors.isNotEmpty); } final List<Color> _colors; Color operator [](int index) => _colors[index % length]; // 返回集合中的元素数量 int get length => _colors.length; /* int nextInt( int max ) 生成一个非负随机整数,范围从0到max(包括max) */ Color random(Random random) => this[random.nextInt(length)]; }
我们将把Bar.empty和Bar.random工厂构造函数放在Bar上。
class Bar { Bar(this.height, this.color); final double height; final Color color; factory Bar.empty() => new Bar(0.0, Colors.transparent); factory Bar.random(Random random) { return new Bar( random.nextDouble() * 100.0, ColorPalette.primary.random(random) ); } static Bar lerp(Bar begin, Bar end, double t) { return new Bar( lerpDouble(begin.height, end.height, t), Color.lerp(begin.color, end.color, t) ); } }
在main.dart中,我们需要创建一个空的Bar和一个随机的Bar。我们将为前者使用完全透明的颜色,后者将使用随机颜色。
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin { // ... @override void initState() { // ... tween = new BarTween(new Bar.empty(), new Bar.random(random)); animation.forward(); } // ... void changeData() { setState(() { tween = new BarTween( tween.evaluate(animation), new Bar.random(random), ); animation.forward(from: 0.0); }); } // ... }
现在应用程序的效果如下图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Flutter进阶之实现动画效果(十),包括了Flutter进阶之实现动画效果(十)的使用技巧和注意事项,需要的朋友参考一下 前面的两篇文章【动画效果(八) 、动画效果(九) 】中,我们只需要统计产品和地区,如果现在增加一个统计项目——销售渠道,那么使用之前的堆叠条形图和分组条形图都不适合。我们可以将两者结合,使用分组+堆叠条形图,实际效果如下图所示: 如上图,我们使用同一种颜色的不
本文向大家介绍Flutter进阶之实现动画效果(九),包括了Flutter进阶之实现动画效果(九)的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章中,我们实现了统计每个产品和地区的销售额,如果现在需要统计每个产品和地区所占市场份额的百分比,那么使用堆叠条形图是不合适的,我们可以使用分组条形图,因为它可以同时在两个类别维度上进行定量比较。分组条形图的实际效果如下图所示: 要实现上面的效果,我们
本文向大家介绍Flutter进阶之实现动画效果(一),包括了Flutter进阶之实现动画效果(一)的使用技巧和注意事项,需要的朋友参考一下 上一篇文章我们了解了Flutter的动画基础,这一篇文章我们就来实现一个图表的动画效果。 首先,我们需要创建一个新项目myapp,然后把main.dart的内容替换成下面的代码 启动项目后,应用程序会显示一个居中的文本标签,显示“数据集:null”和浮动按钮来
本文向大家介绍Flutter进阶之实现动画效果(二),包括了Flutter进阶之实现动画效果(二)的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章:Flutter进阶—实现动画效果(一)的最后,我们说到需要一个处理程序混乱的概念。在这一篇文章中,我们会引入补间,它是构建动画代码的一个非常简单的概念,主要作用是用面向对象的方法替代之前面向过程的方法。tween是一个值,它描述了其他值的空间中的
本文向大家介绍Flutter进阶之实现动画效果(四),包括了Flutter进阶之实现动画效果(四)的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章:Flutter进阶—实现动画效果(三)中,实现了一个随机高度、颜色的条形。这一篇文章我们会实现多个条形,同样是随机高度、颜色。 首先在bar.dart中创建BarChart类,并使用固定长度的Bar实例列表。我们将使用5个条形,表示一周的5个工作
本文向大家介绍Flutter进阶之实现动画效果(五),包括了Flutter进阶之实现动画效果(五)的使用技巧和注意事项,需要的朋友参考一下 在本篇文章开始前,我们先来回顾一下之前我们都做了哪些事情。在第一篇文章中,我们在动画值更改时调用double lerpDouble(num a, num b, double t)重新绘制条形。在第二篇文章中,我们首先用Tween类帮助我们管理动画值,并重新绘制