Flutter动画效果插件animate_do的使用
Flutter动画效果插件animate_do的使用
简介
animate_do
是一个受 Animate.css 启发的Flutter动画包,它完全基于Flutter的动画系统构建,没有外部依赖。该包适用于iOS、Android、Linux、Mac、Web和Windows平台,并且支持Dart 3版本以及空安全(Null-Safety)。
开始使用
animate_do
包非常易于使用。每个动画都包含默认值,这些默认值看起来非常美观,但你也可以根据需要更改属性。
动画组件通用属性
Property | Type | Description |
---|---|---|
key | Key | (可选) Widget键 |
child | Widget | 要动画化的子Widget |
duration | Duration | 动画持续时间 |
delay | Duration | 动画延迟时间 |
from | double | 初始或最终位置,用于滑动或淡入淡出效果 |
animate | boolean | 设置为true以启动动画(适用于setState, Bloc, Provider, Redux等状态管理方式) |
infinite | boolean | 是否无限循环动画 |
spins | double | 指定旋转次数(如Spin, Roulette, PerfectSpin等动画) |
manualTrigger | boolean | 是否手动触发动画(需配合controller属性使用) |
controller | Function | 提供对动画控制器的访问(高级用例中使用) |
onFinish | Function | 动画结束时调用的回调函数 |
curve | Curve | 自定义动画曲线 |
可用动画
FadeIn 动画
- FadeIn
- FadeInDown
- FadeInDownBig
- FadeInUp
- FadeInUpBig
- FadeInLeft
- FadeInLeftBig
- FadeInRight
- FadeInRightBig
FadeOut 动画
- FadeOut
- FadeOutDown
- FadeOutDownBig
- FadeOutUp
- FadeOutUpBig
- FadeOutLeft
- FadeOutLeftBig
- FadeOutRight
- FadeOutRightBig
BounceIn 动画
- BounceInDown
- BounceInUp
- BounceInLeft
- BounceInRight
ElasticIn 动画
- ElasticIn
- ElasticInDown
- ElasticInUp
- ElasticInLeft
- ElasticInRight
SlideIns 动画
- SlideInDown
- SlideInUp
- SlideInLeft
- SlideInRight
FlipIn 动画
- FlipInX
- FlipInY
Zooms 动画
- ZoomIn
- ZoomOut
SpecialIn 动画
- JelloIn
Attention Seeker 动画
- Bounce
- Dance
- Flash
- Pulse
- Roulette
- ShakeX
- ShakeY
- Spin
- SpinPerfect
- Swing
所有Attention Seeker动画都可以通过设置infinite
属性来实现无限循环。
示例代码
基本示例
import 'package:flutter/material.dart';
import 'package:animate_do/animate_do.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App',
theme: ThemeData.light(useMaterial3: true),
home: Scaffold(
body: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
FadeInLeft(child: const Square()),
FadeInUp(child: const Square()),
FadeInDown(child: const Square()),
FadeInRight(child: const Square()),
],
),
),
),
);
}
}
class Square extends StatelessWidget {
const Square({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: 50,
height: 50,
color: Colors.blueAccent,
);
}
}
带有切换功能的基本示例
import 'package:flutter/material.dart';
import 'package:animate_do/animate_do.dart';
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool animate = true;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App',
theme: ThemeData.light(useMaterial3: true),
home: Scaffold(
appBar: AppBar(
title: const Text('Toggle Animation'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
setState(() {
animate = !animate;
});
},
)
],
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
FadeIn(animate: animate, child: const Square()),
FadeInUp(animate: animate, child: const Square()),
FadeInDown(animate: animate, child: const Square()),
FadeInLeft(animate: animate, child: const Square()),
FadeInRight(animate: animate, child: const Square()),
],
),
],
),
),
);
}
}
class Square extends StatelessWidget {
const Square({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: 50,
height: 50,
color: Colors.blueAccent,
);
}
}
使用 onFinish
回调
FadeIn(
animate: animate,
delay: const Duration(milliseconds: 100),
onFinish: (direction) => print('$direction'),
child: const Square(),
)
手动触发动画
如果你需要更细粒度地控制动画,可以使用 manualTrigger
和 controller
属性:
class ManualTriggerExample extends StatefulWidget {
const ManualTriggerExample({Key? key}) : super(key: key);
@override
State<ManualTriggerExample> createState() => _ManualTriggerExampleState();
}
class _ManualTriggerExampleState extends State<ManualTriggerExample>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void triggerAnimation() {
_controller.forward();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Manual Trigger Example'),
),
body: Center(
child: FadeInUp(
manualTrigger: true,
controller: (controller) => _controller = controller,
child: const Square(),
),
),
floatingActionButton: FloatingActionButton(
onPressed: triggerAnimation,
child: const Icon(Icons.play_arrow),
),
);
}
}
以上是关于 animate_do
插件的详细说明及示例代码。希望对你有所帮助!如果需要更多帮助,请随时提问。
更多关于Flutter动画效果插件animate_do的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画效果插件animate_do的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,animate_do
是一个在 Flutter 中非常流行的动画效果插件,它提供了一系列简单且易于使用的动画组件。以下是如何在 Flutter 项目中使用 animate_do
插件来实现一些基本动画效果的代码示例。
首先,你需要在你的 pubspec.yaml
文件中添加 animate_do
依赖:
dependencies:
flutter:
sdk: flutter
animate_do: ^2.0.0 # 请检查最新版本号
然后运行 flutter pub get
来安装依赖。
示例代码
以下是一个简单的 Flutter 应用示例,展示了如何使用 animate_do
插件中的几种动画效果:
import 'package:flutter/material.dart';
import 'package:animate_do/animate_do.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Animate Do Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// FadeIn 动画
FadeIn(
child: Container(
padding: EdgeInsets.all(16.0),
color: Colors.blue,
child: Text(
'Fade In',
style: TextStyle(color: Colors.white),
),
),
duration: 1000, // 动画持续时间,单位为毫秒
),
SizedBox(height: 20),
// FlipInX 动画
FlipInX(
child: Container(
padding: EdgeInsets.all(16.0),
color: Colors.green,
child: Text(
'Flip In X',
style: TextStyle(color: Colors.white),
),
),
duration: 1000,
),
SizedBox(height: 20),
// SlideInLeft 动画
SlideInLeft(
child: Container(
padding: EdgeInsets.all(16.0),
color: Colors.red,
child: Text(
'Slide In Left',
style: TextStyle(color: Colors.white),
),
),
duration: 1000,
),
SizedBox(height: 20),
// ZoomIn 动画
ZoomIn(
child: Container(
padding: EdgeInsets.all(16.0),
color: Colors.purple,
child: Text(
'Zoom In',
style: TextStyle(color: Colors.white),
),
),
duration: 1000,
),
],
),
),
),
);
}
}
解释
- FadeIn:这个动画会使子组件从完全透明渐变到完全不透明。
- FlipInX:这个动画会使子组件在 X 轴上翻转进入屏幕。
- SlideInLeft:这个动画会使子组件从屏幕左侧滑动进入。
- ZoomIn:这个动画会使子组件从缩放到正常大小。
每个动画组件都有一个 duration
属性,你可以通过调整这个属性来改变动画的持续时间。
注意事项
- 确保你已经正确安装了
animate_do
插件。 - 根据需要调整动画的持续时间和其他属性。
- 你可以在
animate_do
的官方文档中查找更多动画效果和详细的使用说明。
这个示例展示了 animate_do
插件的基本用法,希望对你有帮助!