Flutter?Animation實現(xiàn)縮放和滑動動畫效果
本文實例為大家分享了Flutter Animation實現(xiàn)縮放和滑動動畫的具體代碼,供大家參考,具體內(nèi)容如下
Animation對象是Flutter動畫庫中的一個核心類,它生成指導(dǎo)動畫的值。
Animation對象知道動畫的當(dāng)前狀態(tài)(例如,它是開始、停止還是向前或向后移動),但它不知道屏幕上顯示的內(nèi)容。
AnimationController管理Animation。
CurvedAnimation 將過程抽象為一個非線性曲線.
Tween在正在執(zhí)行動畫的對象所使用的數(shù)據(jù)范圍之間生成值。例如,Tween可能會生成從紅到藍(lán)之間的色值,或者從0到255。
使用Listeners和StatusListeners監(jiān)聽動畫狀態(tài)改變。
import 'package:flutter/animation.dart'; import 'package:flutter/material.dart'; void main() { ? runApp(new LogoApp()); } class LogoApp extends StatefulWidget { ? _LogoAppState createState() => new _LogoAppState(); } class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin { ? AnimationController controller; ? Animation<double> animation; ? initState() { ? ? super.initState(); ? ? controller = new AnimationController( ? ? ? ? duration: const Duration(milliseconds: 10000), vsync: this); ? ? animation = new Tween(begin: 0.0, end: 300.0).animate(controller); ? ? controller.forward(); ? } ?? ? Widget build(BuildContext context) { ? ? return new AnimatedLogo(animation: animation); ? } ? dispose() { ? ? controller.dispose(); ? ? super.dispose(); ? } } class AnimatedLogo extends AnimatedWidget { ? AnimatedLogo({Key key, Animation<double> animation}) ? ? ? : super(key: key, listenable: animation); ? Widget build(BuildContext context) { ? ? final Animation<double> animation = listenable; ? ? return new Center( ? ? ? child: new Container( ? ? ? ? margin: new EdgeInsets.symmetric(vertical: 10.0), ? ? ? ? height: animation.value, ? ? ? ? width: animation.value, ? ? ? ? child: new FlutterLogo(), ? ? ? ), ? ? ); ? } }
縮放功能
class ScaleAnimatedContent extends StatefulWidget { ? final Widget child; ? final bool show; ? const ScaleAnimatedContent({Key key, this.child, this.show = false}) ? ? ? : super(key: key); ? @override ? ScaleAnimatedContentState createState() => ScaleAnimatedContentState(); } class ScaleAnimatedContentState extends State<ScaleAnimatedContent> ? ? with TickerProviderStateMixin { ? AnimationController animationController; ? Animation<double> animation; ? @override ? void initState() { ? ? animationController = new AnimationController( ? ? ? vsync: this, ? ? ? duration: new Duration(milliseconds: 600), ? ? ); ? ? // animationSlideUp = new Tween(begin: 0.0,end: 1.0).animate(animationController); ? ? animation = Tween(begin: 0.0, end: 1.0).animate(animationController); ? ? if (widget.show) { ? ? ? animationController.forward(); ? ? } ? ? super.initState(); ? } ? @override ? void didUpdateWidget(ScaleAnimatedContent oldWidget) { ? ? if (widget != oldWidget) { ? ? ? if (widget.show && !oldWidget.show) { ? ? ? ? animationController.forward(from: 0.0); ? ? ? } else if (!widget.show) { ? ? ? ? animationController.reverse(); ? ? ? } ? ? } ? ? super.didUpdateWidget(oldWidget); ? } ? @override ? Widget build(BuildContext context) { ? ? return ScaleTransition( ? ? ? scale: animation, ? ? ? child: widget.child, ? ? ); ? } ? @override ? void dispose() { ? ? animationController.dispose(); ? ? super.dispose(); ? } }
滑動效果
class SlideAnimatedContent extends StatefulWidget { ? final Widget child; ? final bool show; ? const SlideAnimatedContent({Key key, this.child, this.show = false}) ? ? ? : super(key: key); ? @override ? SlideAnimatedContentState createState() => SlideAnimatedContentState(); } class SlideAnimatedContentState extends State<SlideAnimatedContent> ? ? with TickerProviderStateMixin { ? AnimationController animationController; ? Animation<Offset> animationSlideUp; ? @override ? void initState() { ? ? animationController = new AnimationController( ? ? ? vsync: this, ? ? ? duration: new Duration(milliseconds: 600), ? ? ); ? ? animationSlideUp = new Tween( ? ? ? begin: Offset(0.0, 5.0), ? ? ? end: Offset(0.0, 0.0), ? ? ).animate(CurvedAnimation(parent: animationController, curve: Curves.ease)); ? ? if (widget.show) { ? ? ? animationController.forward(); ? ? } ? ? super.initState(); ? } ? @override ? void didUpdateWidget(SlideAnimatedContent oldWidget) { ? ? if (widget != oldWidget) { ? ? ? if (widget.show && !oldWidget.show) { ? ? ? ? animationController.forward(from: 0.0); ? ? ? } else if (!widget.show) { ? ? ? ? animationController.reverse(); ? ? ? } ? ? } ? ? super.didUpdateWidget(oldWidget); ? } ? @override ? Widget build(BuildContext context) { ? ? return SlideTransition( ? ? ? position: animationSlideUp, ? ? ? child: FadeTransition( ? ? ? ? opacity: animationController, ? ? ? ? child: widget.child, ? ? ? ), ? ? ); ? } ? @override ? void dispose() { ? ? animationController.dispose(); ? ? super.dispose(); ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程實現(xiàn)音量按鈕添加監(jiān)聽事件的方法
這篇文章主要介紹了Android編程實現(xiàn)音量按鈕添加監(jiān)聽事件的方法,結(jié)合實例形式分析了Android事件監(jiān)聽實現(xiàn)音量控制的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06Android 中ListView setOnItemClickListener點擊無效原因分析
這篇文章主要介紹了Android 中ListView setOnItemClickListener點擊無效原因分析的相關(guān)資料,需要的朋友可以參考下2016-01-01Android實現(xiàn)圖片反轉(zhuǎn)、翻轉(zhuǎn)、旋轉(zhuǎn)、放大和縮小
這篇文章主要介紹了Android實現(xiàn)圖片反轉(zhuǎn)、翻轉(zhuǎn)、旋轉(zhuǎn)、放大和縮小的相關(guān)代碼,需要的朋友可以參考下2015-09-09Android 從底部彈出Dialog(橫向滿屏)的實例代碼
在android開發(fā)中經(jīng)常會遇到底部彈出框的功能,今天小編抽時間給大家整理一個底部彈出橫向滿屏的dialog,需要的朋友參考下2016-11-11