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