<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一篇我們介紹了 Animation
和 AnimationController
的使用,這是最基本的動畫構建類。但是,如果我們想構建一個可複用的動畫元件,通過外部引數來控制其動畫效果的時候,上一篇的方法就不太合適了。在 Flutter 中提供了 AnimatedWidget
元件用於構建可複用的動畫元件。本篇我們用 AnimatedWidget
來實現元件的3D 旋轉效果,如下圖所示。
AnimatedWidget
是一個抽象的 StatefulWidget
, 構造方法如下所示。
const AnimatedWidget({ Key? key, required this.listenable, }) : assert(listenable != null), super(key: key);
主要在於接收一個 listenable
引數,通常會是 Animation
物件。在 AnimatedWidget
內部的_AnimatedState
類中,會新增該物件變化監聽回撥,進而重新整理介面。
class _AnimatedState extends State<AnimatedWidget> { @override void initState() { super.initState(); widget.listenable.addListener(_handleChange); } @override void didUpdateWidget(AnimatedWidget oldWidget) { super.didUpdateWidget(oldWidget); if (widget.listenable != oldWidget.listenable) { oldWidget.listenable.removeListener(_handleChange); widget.listenable.addListener(_handleChange); } } @override void dispose() { widget.listenable.removeListener(_handleChange); super.dispose(); } void _handleChange() { setState(() { // The listenable's state is our build state, and it changed already. }); } // ... }
可以看到,只需要將 Animation
物件傳給 AnimatedWidget
物件後,就不需要我們之前那樣自己寫 addListener
之類的處理了。而整個動畫可以交給外部其他物件來控制,從而實現動畫元件的複用。
3D 旋轉的實現比較簡單,在 Container
元件有兩個引數控制轉換(transform),分別是:
transform
:Matrix4
物件,可以實現圍繞 X、Y、Z軸的旋轉、平移,以及變形等效果。關於 Matrix4
涉及到很多矩陣運算和線性代數的知識,可以參考 Matrix4的原始碼自行溫習一下大學的數學知識。transformAlignment
:轉換的對齊方式,可以理解為起點位置,可以使用 Alignment
物件來設定。有了這個基礎,我們就可以定義3D 旋轉動效了,我們定義一個通用的元件,ThreeDAnimatedWidget
:
class ThreeDAnimatedWidget extends AnimatedWidget { final Widget child; const ThreeDAnimatedWidget( {Key? key, required Animation<double> animation, required this.child}) : super(key: key, listenable: animation); @override Widget build(BuildContext context) { final animation = listenable as Animation<double>; return Center( child: Container( transform: Matrix4.identity() ..rotateY(2 * pi * animation.value) ..setEntry(1, 0, 0.01), transformAlignment: Alignment.center, child: child, ), ); } }
這裡我們設定的是圍繞中心點繞 Y 軸旋轉,並使用 setEntry
設定了一定的傾斜角 (這會更有立體感)。實際我們也可以設定圍繞 X 軸或 Z 軸旋轉。接下來就是這個動畫元件的應用了,我們構建一個帶有陰影的文字(看起來像立體字)作為這個動畫的子元件,其他的控制和上一篇的是類似的,完整程式碼如下:
class AnimatedWidgetDemo extends StatefulWidget { const AnimatedWidgetDemo({Key? key}) : super(key: key); @override _AnimatedWidgetDemoState createState() => _AnimatedWidgetDemoState(); } class _AnimatedWidgetDemoState extends State<AnimatedWidgetDemo> with SingleTickerProviderStateMixin { late Animation<double> animation; late AnimationController controller; @override void initState() { super.initState(); controller = AnimationController(duration: const Duration(seconds: 3), vsync: this); animation = Tween<double>(begin: 0.0, end: 1.0).animate(controller); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('AnimatedWidget 動畫'), ), body: ThreeDAnimatedWidget( animation: animation, child: Text( '島上碼農', style: TextStyle( fontSize: 42.0, color: Colors.blue, fontWeight: FontWeight.bold, shadows: [ Shadow( blurRadius: 2, offset: Offset(2.0, 1.0), color: Colors.blue[900]!), ], ), ), ), floatingActionButton: FloatingActionButton( child: Icon(Icons.play_arrow, color: Colors.white), onPressed: () { if (controller.status == AnimationStatus.completed) { controller.reverse(); } else { controller.forward(); } }, ), ); } @override void dispose() { controller.dispose(); super.dispose(); } }
可以看到,這個 ThreeDAnimatedWidget
可以做到複用了,在需要這樣動效的場景裡,按照上面的方式給它傳入 Animation
物件和子元件就可以了。例如我們將文字修改為一張圖片。
//... body: ThreeDAnimatedWidget( animation: animation, child: Image.asset( 'images/avatar.jpg', width: 100, height: 100, ), ), //...
圖片旋轉.gif
本篇介紹了 AnimatedWidget
的使用,通過 AnimatedWidget
可以構建可複用的動畫元件。同時,還通過 Container
的 transform
屬性加上 AnimatedWidget
實現了三維空間的旋轉效果。實際開發過程中,我們可以基於 AnimatedWidget
構建很多個性化的、可複用的動畫元件,提升應用的趣味性。
以上就是Android Flutter實現3D動畫效果範例詳解的詳細內容,更多關於Flutter 3D動畫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45