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)在開(kāi)始向我們的單個(gè)條形添加顏色,在Bar類的height字段下添加一個(gè)color字段,并且更新Bar.lerp以使其兩者兼容。在上一篇文章中,介紹過(guò)“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)教程之酷炫的開(kāi)關(guān)動(dòng)畫效果
相關(guān)文章
通過(guò)Jetpack Compose實(shí)現(xiàn)雙擊點(diǎn)贊動(dòng)畫效果
這篇文章主要介紹了如何利用Jetpack Compose實(shí)現(xiàn)雙擊點(diǎn)贊動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-01-01
Android自定義滑動(dòng)接聽(tīng)電話控件組實(shí)例
這篇文章主要介紹了Android自定義滑動(dòng)接聽(tīng)電話控件組,接聽(tīng)電話可以左右滑動(dòng),感興趣的小伙伴們可以參考一下。2016-10-10
MVVMLight項(xiàng)目之綁定在表單驗(yàn)證上的應(yīng)用示例分析
這篇文章主要為大家介紹了MVVMLight項(xiàng)目中綁定在表單驗(yàn)證上的應(yīng)用示例及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步除夕快樂(lè),新年快樂(lè)2022-01-01
Android ListView實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Android微信自動(dòng)搶紅包插件優(yōu)化和實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android微信自動(dòng)搶紅包插件優(yōu)化和實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android 中不用線程如何實(shí)現(xiàn)倒計(jì)時(shí)
本文給大家分享android中不用線程如何實(shí)現(xiàn)倒計(jì)時(shí)功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
使用Android的OkHttp包實(shí)現(xiàn)基于HTTP協(xié)議的文件上傳下載
OkHttp(GitHub主頁(yè)https://github.com/square/okhttp)是近來(lái)人氣攀升的一款安卓第三方HTTP包,這里我們來(lái)講解一下如何使用Android的OkHttp包實(shí)現(xiàn)基于HTTP協(xié)議的文件上傳下載:2016-07-07
Android之ScrollView嵌套ListView和GridView沖突的解決方法
由于ListView,GridView本身都繼承于ScrollView,一旦在ScrollView中嵌套ScrollView,在ScrollView中嵌套使用ListView或者GridView,ListView只會(huì)顯示一行多一點(diǎn)。兩者進(jìn)行嵌套,即會(huì)發(fā)生沖突2013-09-09

