Flutter 中 Animation and Motion(动画)
在 Flutter 中,动画和运动是提升应用用户体验的关键部分。Flutter 提供了多种动画工具和类,帮助开发者轻松创建各种动画效果。
动画的基本组件
- Animation 对象:表示动画的插值值。
Animation
是一个泛型类,可以代表各种类型的值,如double
、Color
或Offset
。 - AnimationController:控制动画的启动、停止、前进和倒退。通常与
TickerProvider
一起使用,后者提供Ticker
对象以驱动动画的时间。 - CurvedAnimation:将线性动画转换为非线性动画,例如加速、减速等。
- Tween:定义动画的起始值和结束值。
动画的使用步骤
- 创建一个
AnimationController
。 - 定义一个
Tween
,用于指定动画的起始值和结束值。 - 将
Tween
和AnimationController
结合,创建一个Animation
对象。 - 在
build
方法中使用AnimatedBuilder
或AnimatedWidget
监听动画的变化,并更新 UI。
示例代码
以下是一个简单的 Flutter 动画示例:一个淡入淡出的动画效果。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Animation Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
);
_animation = CurvedAnimation(parent: _controller, curve: Curves.easeIn);
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Animation Demo'),
),
body: Center(
child: FadeTransition(
opacity: _animation,
child: FlutterLogo(size: 100),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
if (_controller.isCompleted) {
_controller.reverse();
} else {
_controller.forward();
}
},
tooltip: 'Animate',
child: Icon(Icons.play_arrow),
),
);
}
}
解释
- 主结构:应用的入口是
MyApp
,它设置了一个MaterialApp
,并指向MyHomePage
。 MyHomePage
:_controller
:AnimationController
控制动画的开始和结束。_animation
:CurvedAnimation
将线性动画转换为加速动画。
initState
:初始化_controller
和_animation
,并启动动画。dispose
:销毁_controller
以释放资源。build
方法:- 使用
FadeTransition
小部件将动画应用于FlutterLogo
。 - 使用
FloatingActionButton
切换动画的开始和结束。
- 使用
进一步改进
- 使用
AnimatedBuilder
:如果需要在动画过程中重建更复杂的 UI,可以使用AnimatedBuilder
。 - 多种动画组合:可以组合多个动画控制器和曲线,创建更加复杂的动画效果。
- Hero 动画:在路由之间切换时,使用
Hero
小部件实现元素的平滑过渡。
复杂动画示例
以下是一个更复杂的示例,展示如何使用 AnimatedBuilder
创建一个旋转和缩放的动画效果:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Complex Animation Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
);
_animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOut);
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Complex Animation Demo'),
),
body: Center(
child: AnimatedBuilder(
animation: _animation,
child: FlutterLogo(size: 100),
builder: (context, child) {
return Transform.scale(
scale: _animation.value,
child: Transform.rotate(
angle: _animation.value * 2 * 3.14,
child: child,
),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
if (_controller.isCompleted) {
_controller.reverse();
} else {
_controller.forward();
}
},
tooltip: 'Animate',
child: Icon(Icons.play_arrow),
),
);
}
}
这个示例展示了如何使用 AnimatedBuilder
同时控制缩放和旋转效果,从而创建更加复杂的动画。通过理解这些基本原理和示例,你可以在 Flutter 中创建丰富多样的动画效果,从而提升用户体验。
转载自:https://juejin.cn/post/7374617796326572041