<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為了追求更好的使用者體驗,有時候我們需要一個類似心跳一樣跳動著的控制元件來吸參照戶的注意力,這是一個小小的優化需求,但是在 Flutter 裡動畫兩件套就像裹腳布一樣臭長,所以需要像封裝一個 AnimatedWidget,解放生產力。
當建立一個 AnimationController 時,需要傳遞一個vsync
引數,存在vsync
時會防止動畫的UI不在當前螢幕時消耗不必要的資源。 通過混入 SingleTickerProviderStateMixin 。
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{}
建立一個間隔將近一秒鐘的動畫控制器:
late final AnimationController animController; @override void initState() { super.initState(); animController = AnimationController( duration: const Duration(milliseconds: 800), vsync: this, ); }
心跳動畫是從小變大,再變小,所以需要一個值大小變化的動畫:
late final Animation<double> animation; @override void initState() { super.initState(); animController = AnimationController( duration: const Duration(milliseconds: 800), vsync: this, ); animation = Tween<double>( begin: 0.9, end: 1.05, ); }
心跳是不間斷的,所以需要監聽動畫完成時恢復動畫,再繼續開始動畫:
animation = Tween<double>( begin: 0.9, end: 1.05, ).animate(animController) ..addListener(() { setState(() {}); }) ..addStatusListener((status) { if (status == AnimationStatus.completed) { animController.reverse(); } else if (status == AnimationStatus.dismissed) { animController.forward(); } });
使用縮放控制元件:
Transform.scale( scale: animation.value, child: const FlutterLogo( size: 80, ), ),
為了跳動效果,突出跳動動畫,把縮回去的時間改短:
animController = AnimationController( reverseDuration: const Duration(milliseconds: 700), duration: const Duration(milliseconds: 800), vsync: this, );
最後別忘了釋放資源:
@override void dispose() { animController.dispose(); super.dispose(); }
為了每次用到類似的動畫只需引入即可,需要分離動畫和顯示的元件。新建一個BounceWidget
,包含動畫,然後可以傳入UI元件:
class BounceWidget extends StatefulWidget { final Widget child; const BounceWidget({ Key? key, required this.child, }) : super(key: key); @override State<BounceWidget> createState() => _BounceWidgetState(); }
繼續實現動畫:
class _BounceWidgetState extends State<BounceWidget> with SingleTickerProviderStateMixin { late Animation<double> animation; late AnimationController animController; @override void initState() { super.initState(); animController = AnimationController( reverseDuration: const Duration(milliseconds: 700), duration: const Duration(milliseconds: 800), vsync: this, ); animation = Tween<double>( begin: 0.9, end: 1.05, ).animate(animController) ..addListener(() { setState(() {}); }) ..addStatusListener((status) { if (status == AnimationStatus.completed) { animController.reverse(); } else if (status == AnimationStatus.dismissed) { animController.forward(); } }); animController.forward(); } @override Widget build(BuildContext context) { return Transform.scale( scale: animation.value, child: widget.child, ); } @override void dispose() { animController.dispose(); super.dispose(); } }
去引入動畫:
Center( child: BounceWidget( child: FlutterLogo( size: 80, ), ),
void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Padding( padding: const EdgeInsets.only(top: 80, left: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const <Widget>[ Text( "心動的", style: TextStyle( fontSize: 28, color: Colors.black, ), ), Text( "感覺", style: TextStyle( fontSize: 48, color: Colors.black, ), ), Center( child: BounceWidget( child: FlutterLogo( size: 80, ), ), ), ], ), ), ); } }
以上就是Flutter實現心動的動畫特效的詳細內容,更多關於Flutter動畫特效的資料請關注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