flutter PositionedTransition實(shí)現(xiàn)縮放動(dòng)畫
本文實(shí)例為大家分享了flutter實(shí)現(xiàn)縮放動(dòng)畫的具體代碼,供大家參考,具體內(nèi)容如下
flutter 動(dòng)畫狀態(tài)監(jiān)聽器
AnimationController
//動(dòng)畫控制器
AnimationController controller;
//AnimationController是一個(gè)特殊的Animation對象,在屏幕刷新的每一幀,就會(huì)生成一個(gè)新的值,
// 默認(rèn)情況下,AnimationController在給定的時(shí)間段內(nèi)會(huì)線性的生成從0.0到1.0的數(shù)字
//用來控制動(dòng)畫的開始與結(jié)束以及設(shè)置動(dòng)畫的監(jiān)聽
//vsync參數(shù),存在vsync時(shí)會(huì)防止屏幕外動(dòng)畫(動(dòng)畫的UI不在當(dāng)前屏幕時(shí))消耗不必要的資源
//duration 動(dòng)畫的時(shí)長,這里設(shè)置的 seconds: 2 為2秒,當(dāng)然也可以設(shè)置毫秒 milliseconds:2000.
controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//動(dòng)畫開始、結(jié)束、向前移動(dòng)或向后移動(dòng)時(shí)會(huì)調(diào)用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//動(dòng)畫從 controller.reverse() 反向執(zhí)行 結(jié)束時(shí)會(huì)回調(diào)此方法
print("status is completed");
// controller.reset(); 將動(dòng)畫重置到開始前的狀態(tài)
//開始執(zhí)行
//controller.forward();
} else if (status == AnimationStatus.dismissed) {
//動(dòng)畫從 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 的常用操作說明

flutter AnimationStatus 動(dòng)畫狀態(tài)說明

flutter PositionedTransition 實(shí)現(xiàn)中心縮放動(dòng)畫

動(dòng)畫開始與結(jié)束分析

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_x/base/base_appbar_page.dart';
/**
* RelativeRectTween 縮放動(dòng)畫
*/
class RelativeRectTweenPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new RelativeRectTweenState();
}
}
class RelativeRectTweenState extends BaseAppBarPageState<RelativeRectTweenPage>
with SingleTickerProviderStateMixin {
//動(dòng)畫控制器
AnimationController controller;
Animation<RelativeRect> animation;
@override
String buildInitState() {
buildBackBar("動(dòng)畫", backIcon: Icons.arrow_back_ios);
controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//動(dòng)畫開始、結(jié)束、向前移動(dòng)或向后移動(dòng)時(shí)會(huì)調(diào)用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//動(dòng)畫從 controller.forward() 正向執(zhí)行 結(jié)束時(shí)會(huì)回調(diào)此方法
print("status is completed");
//反向執(zhí)行
//controller.reverse();
} else if (status == AnimationStatus.dismissed) {
//動(dòng)畫從 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)畫的過程是
// 子widget 距左邊距離從 10.0 變化 到100.0
// 子widget 距上邊距離從 10.0 變化 到100.0
// 子widget 距右邊距離從 10.0 變化 到100.0
// 子widget 距下邊距離從 10.0 變化 到100.0
// 四邊同時(shí)變化 相同的距離 倍率,所以看出來是 中心縮小的動(dòng)畫
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)畫
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)畫開始
controller.forward();
} else if (controller.isCompleted) {
///反向動(dòng)畫開始
controller.reverse();
} else {
//停止
controller.dispose();
//重置動(dòng)畫
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)容布局
這篇文章主要為大家詳細(xì)介紹了Notification消息通知,消息合并且顯示條數(shù),自定義消息通知內(nèi)容布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android自定義view 你所需要知道的基本函數(shù)總結(jié)
這篇文章主要介紹了Android自定義view 你所需要知道的基本函數(shù)的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android開發(fā)之ClipboardManager剪貼板功能示例
這篇文章主要介紹了Android開發(fā)之ClipboardManager剪貼板功能,結(jié)合簡單實(shí)例形式分析了Android使用ClipboardManager實(shí)現(xiàn)剪貼板功能的相關(guān)操作技巧,需要的朋友可以參考下2017-03-03
Android實(shí)現(xiàn)應(yīng)用內(nèi)置語言切換功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)應(yīng)用內(nèi)置語言切換功能,具有一定的參考價(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-03
Android 中build.prop 文件與 getprop 命令
這篇文章主要介紹了Android 中build.prop 文件與 getprop 命令的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android通過bin二進(jìn)制程序調(diào)用jar原理
最近在研究monkey測試,發(fā)現(xiàn)monkey測試的代碼都是JAVA編寫的,通過編譯生成jar包,而我們在執(zhí)行測試時(shí)直接執(zhí)行/system/bin/monkey這個(gè)二進(jìn)制程序的,那么它是如何能調(diào)起java程序的呢,本文小編給大家介紹了Android通過bin二進(jìn)制程序調(diào)用jar原理,需要的朋友可以參考下2023-10-10

