flutter PositionedTransition實現(xiàn)縮放動畫
本文實例為大家分享了flutter實現(xiàn)縮放動畫的具體代碼,供大家參考,具體內(nèi)容如下
flutter 動畫狀態(tài)監(jiān)聽器
AnimationController
//動畫控制器 AnimationController controller; //AnimationController是一個特殊的Animation對象,在屏幕刷新的每一幀,就會生成一個新的值, // 默認(rèn)情況下,AnimationController在給定的時間段內(nèi)會線性的生成從0.0到1.0的數(shù)字 //用來控制動畫的開始與結(jié)束以及設(shè)置動畫的監(jiān)聽 //vsync參數(shù),存在vsync時會防止屏幕外動畫(動畫的UI不在當(dāng)前屏幕時)消耗不必要的資源 //duration 動畫的時長,這里設(shè)置的 seconds: 2 為2秒,當(dāng)然也可以設(shè)置毫秒 milliseconds:2000. controller = AnimationController(duration: const Duration(seconds: 2), vsync: this); //動畫開始、結(jié)束、向前移動或向后移動時會調(diào)用StatusListener controller.addStatusListener((status) { if (status == AnimationStatus.completed) { //動畫從 controller.reverse() 反向執(zhí)行 結(jié)束時會回調(diào)此方法 print("status is completed"); // controller.reset(); 將動畫重置到開始前的狀態(tài) //開始執(zhí)行 //controller.forward(); } else if (status == AnimationStatus.dismissed) { //動畫從 controller.forward() 正向執(zhí)行 結(jié)束時會回調(diào)此方法 print("status is dismissed"); //controller.forward(); }else if (status == AnimationStatus.forward) { print("status is forward"); //執(zhí)行 controller.forward() 會回調(diào)此狀態(tài) }else if (status == AnimationStatus.reverse) { //執(zhí)行 controller.reverse() 會回調(diào)此狀態(tài) print("status is reverse"); } });
AnimationController 的常用操作說明
flutter AnimationStatus 動畫狀態(tài)說明
flutter PositionedTransition 實現(xiàn)中心縮放動畫
動畫開始與結(jié)束分析
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_x/base/base_appbar_page.dart'; /** * RelativeRectTween 縮放動畫 */ class RelativeRectTweenPage extends StatefulWidget { @override State<StatefulWidget> createState() { return new RelativeRectTweenState(); } } class RelativeRectTweenState extends BaseAppBarPageState<RelativeRectTweenPage> with SingleTickerProviderStateMixin { //動畫控制器 AnimationController controller; Animation<RelativeRect> animation; @override String buildInitState() { buildBackBar("動畫", backIcon: Icons.arrow_back_ios); controller = AnimationController(duration: const Duration(seconds: 2), vsync: this); //動畫開始、結(jié)束、向前移動或向后移動時會調(diào)用StatusListener controller.addStatusListener((status) { if (status == AnimationStatus.completed) { //動畫從 controller.forward() 正向執(zhí)行 結(jié)束時會回調(diào)此方法 print("status is completed"); //反向執(zhí)行 //controller.reverse(); } else if (status == AnimationStatus.dismissed) { //動畫從 controller.reverse() 反向執(zhí)行 結(jié)束時會回調(diào)此方法 print("status is dismissed"); //controller.forward(); } else if (status == AnimationStatus.forward) { print("status is forward"); //執(zhí)行 controller.forward() 會回調(diào)此狀態(tài) } else if (status == AnimationStatus.reverse) { //執(zhí)行 controller.reverse() 會回調(diào)此狀態(tài) print("status is reverse"); } }); // 這個動畫的過程是 // 子widget 距左邊距離從 10.0 變化 到100.0 // 子widget 距上邊距離從 10.0 變化 到100.0 // 子widget 距右邊距離從 10.0 變化 到100.0 // 子widget 距下邊距離從 10.0 變化 到100.0 // 四邊同時變化 相同的距離 倍率,所以看出來是 中心縮小的動畫 RelativeRectTween rectTween = RelativeRectTween( //初始位置設(shè)置 begin: const RelativeRect.fromLTRB( //子widget 距父布局 left 10.0 10.0, //子widget 距父布局 top 10.0 10.0, //子widget 距父布局 right 10.0 10.0, //子widget 距父布局 bottom 10.0 10.0), //結(jié)束位置設(shè)置 end: RelativeRect.fromLTRB( //子widget 距父布局 left 100.0 100.0, //子widget 距父布局 top 100.0 100.0, //子widget 距父布局 right 100.0 100.0, //子widget 距父布局 bottom 100.0 100.0, ), ); //關(guān)聯(lián) controller animation = rectTween.animate(controller); return null; } @override Widget buildWidget(BuildContext context) { return buildSlideTransition(); } @override void dispose() { super.dispose(); controller.dispose(); } //漸變動畫 Widget buildSlideTransition() { return Stack( children: <Widget>[ //必須作為Stack的子widget PositionedTransition( rect: animation, child: Container( color: Colors.grey, child: Image.network( "http://img5.duitang.com/uploads/item/201411/16/20141116124947_xBNxM.jpeg", ), ), ), Positioned( bottom: 20, left: 20, child: FlatButton( onPressed: () { if (controller.isDismissed) { ///正向動畫開始 controller.forward(); } else if (controller.isCompleted) { ///反向動畫開始 controller.reverse(); } else { //停止 controller.dispose(); //重置動畫 controller.reset(); } }, child: Text("開始")), ) ], ); } }
flutter PositionedTransition 向上縮放
RelativeRectTween rectTween = RelativeRectTween( //初始位置設(shè)置 begin: const RelativeRect.fromLTRB( 50.0, 50.0, 50.0, 50.0), //結(jié)束位置設(shè)置 end: RelativeRect.fromLTRB( 50.0, 50.0, 50.0, 500.0, ), );
flutter PositionedTransition 向右縮放
RelativeRectTween rectTween = RelativeRectTween( //初始位置設(shè)置 begin: const RelativeRect.fromLTRB( 50.0, 50.0, 50.0, 50.0), //結(jié)束位置設(shè)置 end: RelativeRect.fromLTRB( 500.0, 50.0, 50.0, 50.0, ), );
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Notification消息通知 自定義消息通知內(nèi)容布局
這篇文章主要為大家詳細介紹了Notification消息通知,消息合并且顯示條數(shù),自定義消息通知內(nèi)容布局,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Android自定義view 你所需要知道的基本函數(shù)總結(jié)
這篇文章主要介紹了Android自定義view 你所需要知道的基本函數(shù)的相關(guān)資料,需要的朋友可以參考下2017-02-02Android開發(fā)之ClipboardManager剪貼板功能示例
這篇文章主要介紹了Android開發(fā)之ClipboardManager剪貼板功能,結(jié)合簡單實例形式分析了Android使用ClipboardManager實現(xiàn)剪貼板功能的相關(guān)操作技巧,需要的朋友可以參考下2017-03-03Android實現(xiàn)應(yīng)用內(nèi)置語言切換功能
這篇文章主要為大家詳細介紹了Android實現(xiàn)應(yīng)用內(nèi)置語言切換功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02解決Android Studio 出現(xiàn)“Cannot resolve symbo
今天在調(diào)試的時候,Android Studio報了一個莫名其妙的錯誤Cannot resolve symbol'R'讓人不知所措,因為這東西根本不歸我管啊,怎么會出現(xiàn) Cannot resolve symbol 這種錯誤呢?下面給大家分享Android Studio 出現(xiàn)“Cannot resolve symbol”解決方案,需要的朋友可以參考下2023-03-03Android 中build.prop 文件與 getprop 命令
這篇文章主要介紹了Android 中build.prop 文件與 getprop 命令的相關(guān)資料,需要的朋友可以參考下2017-06-06Android通過bin二進制程序調(diào)用jar原理
最近在研究monkey測試,發(fā)現(xiàn)monkey測試的代碼都是JAVA編寫的,通過編譯生成jar包,而我們在執(zhí)行測試時直接執(zhí)行/system/bin/monkey這個二進制程序的,那么它是如何能調(diào)起java程序的呢,本文小編給大家介紹了Android通過bin二進制程序調(diào)用jar原理,需要的朋友可以參考下2023-10-10