本例的代碼參考這裏。git
當多個動畫定義同時指向某個組件,並使用動畫控制器啓動時,就產生了並行動畫(Parallel Animation)。例如咱們能夠讓一個組件:github
總之,掌握了動畫原理之後咱們知道,只要能將一個動畫抽象值與一個組件的某個外觀屬性值聯繫起來,那麼就能在動畫中展示出連續平滑的外觀變化。這一點,任何平臺(Web、Android)的原理都是一致的。ide
接前一篇的例子,咱們讓一個移動的正方形在位移過程當中逐漸變爲圓形。動畫
在已有的animation基礎上,再添加一個新的animation用以控制動畫組件的邊角半徑。ui
class ParallelDemoState extends State<ParallelDemo> with SingleTickerProviderStateMixin { ... Tween<double> slideTween = Tween(begin: 0.0, end: 200.0); Tween<double> borderTween = Tween(begin: 0.0, end: 40.0); // 添加邊角半徑變更範圍 Animation<double> slideAnimation; Animation<double> borderAnimation; // 添加邊角半徑動畫定義 @override void initState() { ... controller = AnimationController(duration: Duration(milliseconds: 2000), vsync: this); slideAnimation = slideTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); borderAnimation = borderTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); // 定義邊角半徑動畫 } ... @override Widget build(BuildContext context) { return Container( width: 200, alignment: Alignment.centerLeft, child: Container( margin: EdgeInsets.only(left: slideAnimation.value), decoration: BoxDecoration( borderRadius: BorderRadius.circular(borderAnimation.value), // 邊角半徑的屬性上添加動畫 color: Colors.blue, ), width: 80, height: 80, ), ); } }
串行動畫(Sequential Animation)顧名思義,多個動畫像肉串同樣一個接一個的發生。但這只是從現象上觀察出的結果,實際的運行方式和並行動畫差異不大。串行動畫的關鍵之處在於,它爲每一個動畫的發生設定了一個計時器,只有到特定時間點時,特定的動畫效果纔會發生。this
例如設計一個3秒鐘的動畫:spa
那麼,最後的動畫效果即是:設計
在串行動畫例子的基礎上,咱們加上計時器Interval的處理。Interval有三個參數,前兩個參數指示了動畫的開始和結束時間。這兩個參數都是以動畫控制器的Duration時長的比例來計算的。例如:code
class SequentialDemoState extends State<ParallelDemo> with SingleTickerProviderStateMixin { ... @override void initState() { ... controller = AnimationController(duration: Duration(milliseconds: 2000), vsync: this); // slideAnimation = slideTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); // borderAnimation = borderTween.animate(CurvedAnimation(parent: controller, curve: Curves.linear)); // 定義邊角半徑動畫 // 換一種寫法,加入Interval slideAnimation = slideTween.animate(CurveTween(curve: Interval(0.0, 0.5, curve: Curves.linear)).animate(controller)); borderAnimation = borderTween.animate(CurveTween(curve: Interval(0.5, 1.0, curve: Curves.linear)).animate(controller)); } ... @override Widget build(BuildContext context) { return Container( width: 200, alignment: Alignment.centerLeft, child: Container( margin: EdgeInsets.only(left: slideAnimation.value), decoration: BoxDecoration( borderRadius: BorderRadius.circular(borderAnimation.value), // 邊角半徑的屬性上添加動畫 color: Colors.blue, ), width: 80, height: 80, ), ); } }