Flutter 動(dòng)畫

1.?AnimationController

動(dòng)畫控制器,控制動(dòng)畫的啟動(dòng)山析、停止奶是,還可以獲取動(dòng)畫的運(yùn)行狀態(tài)

class _AnimationDemoState extends State<AnimationDemo>?with SingleTickerProviderStateMixin

創(chuàng)建一個(gè)AnimationController

AnimationController(vsync:this, duration:Duration(seconds:3))

vsync:本身Widget(單個(gè) AnimationController 的時(shí)候使用?SingleTickerProviderStateMixin瑞佩,多個(gè) AnimationController 使用?TickerProviderStateMixin)聚磺,?存在vsync時(shí)會(huì)防止屏幕外動(dòng)畫消耗不必要的資源

動(dòng)畫的狀態(tài)分為四種:

dismissed:動(dòng)畫停止在開始處。

forward:動(dòng)畫正在從開始處運(yùn)行到結(jié)束處(正向運(yùn)行)钉凌。

reverse:動(dòng)畫正在從結(jié)束處運(yùn)行到開始處(反向運(yùn)行)咧最。

completed:動(dòng)畫停止在結(jié)束處。

動(dòng)畫的控制方法:

forward:正向執(zhí)行動(dòng)畫御雕。

reverse:反向執(zhí)行動(dòng)畫矢沿。

repeat:反復(fù)執(zhí)行動(dòng)畫。

reset:重置動(dòng)畫酸纲。

使用示例

監(jiān)聽頁面狀態(tài)變化

_animationController.addStatusListener((status) {

????if (status == AnimationStatus.completed) {

????????_animationController.reset();

????????setState(() {

????????????_islike =false;

????????});????????

????}

});

_animationController?.addListener(() {

? ? // 頁面刷新

????setState(() {

????});

});

_animationController.value 默認(rèn)值值是從0-1的

AnimationController銷毀

void dispose() {

????super.dispose();

????_animationController?.dispose();

}

2.Tween 和 Curve

把從 0 -> 1 轉(zhuǎn)換為 藍(lán)色 -> 紅色 行為稱之為?Tween(映射)捣鲸,

Curve?Tween的值之間變化的規(guī)律(線性...)

系統(tǒng)提供的 Tween(選中類Tween,快捷鍵Ctrol+h,查看類的繼承關(guān)系)


系統(tǒng)的Tween

系統(tǒng)已經(jīng)提供了38種常用到動(dòng)畫曲線?Curves.bounceIn

使用示例

ColorTween(begin: Colors.blue, end: Colors.red)

????.chain(CurveTween(curve: Curves.bounceIn))

????.animate(_animationController!)

另外一種使用方式

_animationController?.drive(CurveTween(curve: Curves.linear))

.drive(Tween(begin:100.0, end:200.0));

自定義curve

class MyCurve extends Curve {

? ????@override

????? double transformInternal(double t) {

? ? ????return t; //線性執(zhí)行

????? }

}?

需要繼承 Curve 重寫 transformInternal 方法

3.組合動(dòng)畫

實(shí)現(xiàn) 40%,widget由 100 -> 200, 20% widget大小保持不變闽坡, 40%widget 背景色由藍(lán)色-> 紅色

_tweenSequenceAnimation =TweenSequence([

????TweenSequenceItem(tween:Tween(begin:100.0, end:200.0), weight:40),

????TweenSequenceItem(tween:ConstantTween(200.0), weight:20),

????TweenSequenceItem(tween:ColorTween(begin: Colors.blue, end: Colors.red), weight:40),

]).animate(_animationController!);

TweenSequence 值使用

width:_tweenSequenceAnimation?.value is double ?_tweenSequenceAnimation?.value :200,

height:_tweenSequenceAnimation?.value is double ?_tweenSequenceAnimation?.value :200,

color:_tweenSequenceAnimation?.value is Color ?_tweenSequenceAnimation?.value : Colors.blue

4.隱性動(dòng)畫和顯性動(dòng)畫

顯性動(dòng)畫:動(dòng)畫組件只封裝 setState?方法

隱性動(dòng)畫:組件封裝了 AnimationController栽惶、Curve、Tween

顯性動(dòng)畫系統(tǒng)的類

? ??

顯性動(dòng)畫系統(tǒng)的類

隱性動(dòng)畫系統(tǒng)的類


隱性動(dòng)畫系統(tǒng)的類

使用示例 見下面路由動(dòng)畫

5.路由動(dòng)畫

自定義動(dòng)畫 需要實(shí)現(xiàn)PageRouteBuilder

自定義從左往右動(dòng)畫

class LeftToRightPageRouteextends PageRouteBuilder {

????final Widget_newpage;

????LeftToRightPageRoute(this._newpage)

????:super(pageBuilder: (BuildContext context, Animation animation,

????Animation secondaryAnimation) {

????????return _newpage;

? ? ? }, transitionsBuilder: (BuildContext context,

????????????Animation animation,

????????????Animation secondaryAnimation,

????????????Widget child) {

????????????return SlideTransition(

????????????????????position:Tween(begin:Offset(1,0), end:Offset(0,0))

????????????????????.animate(animation),

????????????????????child: child,

????????????);

????????});

}

// 頁面圓形形狀 打開

class CirclePageRouteextends PageRouteBuilder {

????final Widget_newpage;

????CirclePageRoute(this._newpage)

????????:super(pageBuilder: (BuildContext context, Animation animation,

????????????Animation secondaryAnimation) {

????????????????return _newpage;

????????????}, transitionsBuilder: (BuildContext context,

????????????????Animation animation,

????????????????Animation secondaryAnimation,

????????????????Widget child) {

????????????????return AnimatedBuilder(

????????????????????animation: animation,

????????????????????builder: (context, child) {

????????????????????return ClipPath(

????????????????????????????clipper:_CustomClip(animation.value),

? ? ? ? ? ? ? ? ? ? ? ????????child: child,

????????????????????????);

????????????????????},

????????????????child: child,

? ? ? ?????);

????});

}

自定義裁剪形狀

class _CustomClipextends CustomClipper {

final doublevalue;

_CustomClip(this.value);

@override

? Path getClip(Size size) {

????????Path _path =Path();

????????double radius = value * sqrt(size.height * size.height + size.width * size.width);

????????_path.addOval(Rect.fromCircle(center:Offset(size.width,0), radius: radius));

????????return _path;

}

@override

? bool shouldReclip(covariant CustomClipper oldClipper) {

????????return true;

????}

}

6.其他動(dòng)畫

Hero 動(dòng)畫疾嗅,系統(tǒng)提供的動(dòng)畫插件animations: ^1.1.1(使用參考官方文檔)

Flow(

????delegate:CirclePointFlowDelegate(),

????children: [

????????_buildCirclePoint(2,Color(0xFF97B1CE), circleAnimation), // 自定義的組件外厂,circleAnimation Animation????

????],

)

class CirclePointFlowDelegateextends FlowDelegate {

????@override

? ????void paintChildren(FlowPaintingContext context) {

????????????print(context.size);

????????????double radius =30;

????????????double rx = context.size.width /2;

????????????double ry = context.size.height /2;

????????????for (int i =0;i < context.childCount;i++) {

????????????????print(context.getChildSize(i));

????????????????if (i %2 ==0) {

????????????????????double x = rx + (radius) * cos(i *2 * pi / (context.childCount -1));

????????????????????double y = ry + (radius) * sin(i *2 * pi / (context.childCount -1));

????????????????????context.paintChild(i, transform:Matrix4.translationValues(x, y,0));

????????????????}else {

????????????????????double x = rx + (radius ) * cos((i -1) *2 * pi / (context.childCount -1) + 2 * pi / ((context.childCount -1) *3));

????????????????????double y = ry + (radius) * sin((i -1) *2 * pi / (context.childCount -1) + 2 * pi / ((context.childCount -1) *3));

????????????????????context.paintChild(i, transform:Matrix4.translationValues(x, y,0));

????????????????}

????????}

}

@override

? bool shouldRepaint(covariant FlowDelegate oldDelegate) {

????????return true;

????}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市代承,隨后出現(xiàn)的幾起案子汁蝶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掖棉,死亡現(xiàn)場離奇詭異墓律,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幔亥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門耻讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帕棉,你說我怎么就攤上這事针肥。” “怎么了香伴?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵祖驱,是天一觀的道長。 經(jīng)常有香客問我瞒窒,道長,這世上最難降的妖魔是什么乡洼? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任崇裁,我火速辦了婚禮,結(jié)果婚禮上束昵,老公的妹妹穿的比我還像新娘拔稳。我一直安慰自己,他們只是感情好锹雏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布巴比。 她就那樣靜靜地躺著,像睡著了一般礁遵。 火紅的嫁衣襯著肌膚如雪轻绞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天佣耐,我揣著相機(jī)與錄音政勃,去河邊找鬼。 笑死兼砖,一個(gè)胖子當(dāng)著我的面吹牛奸远,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讽挟,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懒叛,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了耽梅?” 一聲冷哼從身側(cè)響起薛窥,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褐墅,沒想到半個(gè)月后拆檬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洪己,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年竟贯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了答捕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屑那,死狀恐怖拱镐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情持际,我是刑警寧澤沃琅,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蜘欲,受9級(jí)特大地震影響益眉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姥份,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一郭脂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澈歉,春花似錦展鸡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涡尘,卻和暖如春忍弛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背考抄。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工剧罩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人座泳。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓惠昔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挑势。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镇防,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述 動(dòng)畫API認(rèn)識(shí) 動(dòng)畫案例練習(xí) 其它動(dòng)畫補(bǔ)充 一、動(dòng)畫API認(rèn)識(shí) 動(dòng)畫實(shí)際上是我們通過某些方式(某種對(duì)象潮饱,An...
    IIronMan閱讀 362評(píng)論 1 3
  • Flutter的動(dòng)畫體系是怎么運(yùn)作的来氧,各組件之間的關(guān)聯(lián)關(guān)系及原理什么,隱式動(dòng)畫、顯式動(dòng)畫怎么區(qū)分啦扬,本文將會(huì)進(jìn)行詳細(xì)...
    whqfor閱讀 2,014評(píng)論 0 6
  • flutter動(dòng)畫 1.動(dòng)畫原理:在一段時(shí)間內(nèi)快速的多次改變UI外觀中狂,由于人眼會(huì)產(chǎn)生視覺暫留所以最終看到的就是一個(gè)...
    Liu_QT閱讀 1,621評(píng)論 0 1
  • 上一篇我們寫了一個(gè)文件漸變動(dòng)畫,但是寫法非常繁瑣,而且動(dòng)畫和控件結(jié)合的太緊密了,如果繼續(xù)添加別的效果需要修改的地方...
    Tsm_2020閱讀 999評(píng)論 0 2
  • Flutter動(dòng)畫類型 動(dòng)畫分為兩類:基于tween或基于物理的胃榕。以下部分解釋了這些術(shù)語的含義,并指出您可以在其中...
    蓋世英雄_ix4n04閱讀 6,172評(píng)論 0 2