Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(三)
在上一篇文章:Flutter進(jìn)階—實(shí)現(xiàn)動(dòng)畫效果(二)的最后,我們實(shí)現(xiàn)了一個(gè)控件,其中包含各種布局和狀態(tài)處理控件。以及使用自定義的動(dòng)畫感知繪圖代碼繪制單個(gè)Bar的控件。還有一個(gè)浮動(dòng)按鈕控件,用于啟動(dòng)條形圖高度的動(dòng)畫變化。
現(xiàn)在開始向我們的單個(gè)條形添加顏色,在Bar類的height字段下添加一個(gè)color字段,并且更新Bar.lerp以使其兩者兼容。在上一篇文章中,介紹過“l(fā)erp”是“線性內(nèi)插”或“線性插值”的一種簡(jiǎn)短形式。
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) ); } }
要在我們的應(yīng)用程序中使用彩色條形,需要更新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同級(jí)目錄下新建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:如果此集合中至少有一個(gè)元素,則返回true assert(colors.isNotEmpty); } final List<Color> _colors; Color operator [](int index) => _colors[index % length]; // 返回集合中的元素?cái)?shù)量 int get length => _colors.length; /* int nextInt( int max ) 生成一個(gè)非負(fù)隨機(jī)整數(shù),范圍從0到max(包括max) */ Color random(Random random) => this[random.nextInt(length)]; }
我們將把Bar.empty和Bar.random工廠構(gòu)造函數(shù)放在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中,我們需要?jiǎng)?chuàng)建一個(gè)空的Bar和一個(gè)隨機(jī)的Bar。我們將為前者使用完全透明的顏色,后者將使用隨機(jī)顏色。
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); }); } // ... }
現(xiàn)在應(yīng)用程序的效果如下圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(一)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(二)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(十)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(五)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(九)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(四)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(八)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(七)
- Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(六)
- Flutter實(shí)戰(zhàn)教程之酷炫的開關(guān)動(dòng)畫效果
相關(guān)文章
Android平臺(tái)基于Pull方式對(duì)XML文件解析與寫入方法詳解
這篇文章主要介紹了Android平臺(tái)基于Pull方式對(duì)XML文件解析與寫入方法,結(jié)合實(shí)例形式分析了Android基于Pull方式對(duì)xml文件解析及寫入操作的步驟、原理與操作技巧,需要的朋友可以參考下2016-10-10Flutter 如何設(shè)置App的主色調(diào)與字體
App 開發(fā)過程中,肯定希望給用戶帶來一致的體驗(yàn),這其中最基礎(chǔ)的就是色調(diào)、字體保持一致。在 Flutter 中,可以設(shè)置全局的主題色調(diào)和字體,從而在其他頁面引用主色調(diào)和字體,實(shí)現(xiàn)頁面展示層面的一致。2021-05-05詳解Android中Handler的內(nèi)部實(shí)現(xiàn)原理
這篇文章主要介紹了Android中Handler的內(nèi)部實(shí)現(xiàn)原理,對(duì)Handler和消息循環(huán)的實(shí)現(xiàn)原理進(jìn)行源碼分析,需要的朋友可以參考下2015-12-12Android設(shè)計(jì)模式之適配器(Adapter)模式
這篇文章主要介紹了Android設(shè)計(jì)模式之適配器(Adapter)模式,以源碼解析的方式分析適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android事件分發(fā)機(jī)制深入刨析原理及源碼
Android?的事件分發(fā)機(jī)制大體可以分為三部分:事件生產(chǎn)、事件分發(fā)?、事件消費(fèi)。事件的生產(chǎn)是由用戶點(diǎn)擊屏幕產(chǎn)生,我們這次著重分析事件的分發(fā)和消費(fèi),因?yàn)槭录职l(fā)和處理聯(lián)系的過于緊密,這篇文章將把事件的分發(fā)和消費(fèi)放在一起分析2023-04-04