Flutter动画效果插件animator的使用
Flutter动画效果插件animator的使用
Flutter中的animator
包是一个强大的动画库,它使得创建和控制动画变得异常简单。这个库提供了两种主要的Widget:Animator
和AnimateWidget
,它们可以帮助开发者快速实现显式和隐式的动画效果。
Animator
与AnimateWidget
- Animator 是最初引入的Widget,主要用于显式动画。
- AnimateWidget 是一个更强大的Widget,它可以用于隐式动画、显式动画以及交错动画(staggered animation)。
AnimateWidget参数设置
AnimateWidget({
Key? key,
double? initialValue,
double lowerBound = 0.0,
double upperBound = 1.0,
Duration duration = const Duration(milliseconds: 500),
Duration? reverseDuration,
Curve curve = Curves.linear,
Curve? reverseCurve,
AnimationBehavior animationBehavior = AnimationBehavior.normal,
int? repeats,
int? cycles,
void Function()? endAnimationListener,
bool triggerOnInit = true,
bool triggerOnRebuild = false,
bool resetOnRebuild = false,
required Widget Function(BuildContext, Animate) builder,
})
参数说明:
- initialValue, lowerBound, upperBound: 动画控制器的初始值、下限和上限。
- duration, reverseDuration: 动画正向和反向的时间。
- curve, reverseCurve: 动画正向和反向的曲线。
- animationBehavior: 控制器在
AccessibilityFeatures.disableAnimations
为true时的行为。 - repeats, cycles: 定义动画重复次数或周期数。
- endAnimationListener: 动画结束时触发的回调函数。
- triggerOnInit, triggerOnRebuild, resetOnRebuild: 控制动画何时启动或重置。
- builder: 构建动画内容的回调函数。
隐式动画示例
以下是如何使用AnimateWidget
来创建一个类似AnimatedContainer
的效果:
Center(
child: AnimateWidget(
duration: const Duration(seconds: 2),
curve: Curves.fastOutSlowIn,
builder: (context, animate) => Container(
width: animate.call(selected ? 200.0 : 100.0),
height: animate.call(selected ? 100.0 : 200.0, 'height'),
color: animate.call(selected ? Colors.red : Colors.blue),
alignment: animate.call(selected ? Alignment.center : AlignmentDirectional.topCenter),
child: const FlutterLogo(size: 75),
),
),
);
显式动画示例
下面是一个显式动画的例子,通过tween
来控制旋转角度:
AnimatedWidget(
duration: const Duration(seconds: 2),
builder: (context, animate) {
final angle = animate.fromTween(
(currentValue) => Tween(begin: 0, end: 2 * 3.14),
)!;
return Transform.rotate(
angle: angle,
child: const FlutterLogo(size: 75),
);
},
);
使用Flutter的过渡Widget
你还可以结合Flutter内置的过渡Widget,如PositionedTransition
等,来创建复杂的动画效果:
AnimateWidget(
builder: (context, animate) => PositionedTransition(
rect: RelativeRectTween(
begin: RelativeRect.fromSize(const Rect.fromLTWH(0, 0, smallLogo, smallLogo), biggest),
end: RelativeRect.fromSize(
Rect.fromLTWH(biggest.width - bigLogo, biggest.height - bigLogo, bigLogo, bigLogo),
biggest,
),
).animate(animate.curvedAnimation),
child: const Padding(padding: EdgeInsets.all(8), child: FlutterLogo()),
),
);
交错动画示例
交错动画允许你在同一时间线内对不同的属性应用不同的动画效果:
class _MyStaggeredWidgetState extends State<MyStatefulWidget> {
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {});
},
child: AnimateWidget(
duration: const Duration(milliseconds: 2000),
cycles: 2,
triggerOnRebuild: true,
triggerOnInit: false,
builder: (context, animate) {
final padding = animate
.setCurve(Interval(0.250, 0.375, curve: Curves.ease))
.fromTween(
(_) => EdgeInsetsTween(
begin: const EdgeInsets.only(bottom: 16.0),
end: const EdgeInsets.only(bottom: 75.0),
),
);
// 其他属性类似设置...
return Center(
child: Container(
width: 300.0,
height: 300.0,
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.1),
border: Border.all(color: Colors.black.withOpacity(0.5)),
),
child: Container(
padding: padding,
alignment: Alignment.bottomCenter,
child: Opacity(
opacity: opacity,
child: Container(
width: containerWidget,
height: containerHeight,
decoration: BoxDecoration(
color: color,
border: Border.all(color: Colors.indigo[300]!, width: 3.0),
borderRadius: borderRadius,
),
),
),
),
),
);
},
),
);
}
}
示例项目
为了更好地理解如何使用animator
库,可以参考以下完整的示例代码:
import 'package:flutter/material.dart';
import 'package:animator/animator.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Animator Demo',
home: Scaffold(
appBar: AppBar(
title: Text("Animator demo"),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
goto(Widget page, BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => page,
),
);
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
ElevatedButton(
child: Text("Basic Animation 0"),
onPressed: () => goto(BasicAnimation0(), context),
),
ElevatedButton(
child: Text("Basic Animation 1"),
onPressed: () => goto(BasicAnimation1(), context),
),
ElevatedButton(
child: Text("Basic Animation 2"),
onPressed: () => goto(MyCustomPainterAnimation(), context),
),
ElevatedButton(
child: Text("Implicit animation"),
onPressed: () => goto(BasicAnimation3(), context),
),
],
),
);
}
}
以上代码展示了如何创建一个包含多个基本动画演示的应用程序。每个按钮点击后会导航到不同的页面,展示不同类型的动画效果。
更多关于Flutter动画效果插件animator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画效果插件animator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,我可以为你提供一个关于如何在Flutter中使用animator
插件来实现动画效果的示例。animator
是一个在Flutter社区中较为流行的动画库,尽管它不是官方的库,但它提供了很多便捷的动画功能。以下是一个简单的示例,展示了如何使用animator
插件来创建一个淡入淡出的动画效果。
首先,你需要在你的pubspec.yaml
文件中添加animator
依赖:
dependencies:
flutter:
sdk: flutter
animator: ^3.0.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter应用中,你可以使用animator
来创建动画。以下是一个完整的示例,展示了如何实现一个淡入淡出的动画效果:
import 'package:flutter/material.dart';
import 'package:animator/animator.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Animator Example'),
),
body: Center(
child: FadeInOutAnimationExample(),
),
),
);
}
}
class FadeInOutAnimationExample extends StatefulWidget {
@override
_FadeInOutAnimationExampleState createState() => _FadeInOutAnimationExampleState();
}
class _FadeInOutAnimationExampleState extends State<FadeInOutAnimationExample> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true); // 无限循环动画,正向和反向
_animation = _controller.drive(Tween<double>(begin: 0.0, end: 1.0).chain(CurveTween(curve: Curves.easeInOut)));
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Animator<double>(
tween: Tween<double>(begin: 0.0, end: 1.0),
duration: _controller.duration,
curve: Curves.easeInOut,
builder: (anim) {
return AnimatedOpacity(
opacity: anim.value,
child: Container(
width: 200,
height: 200,
color: Colors.blue,
child: Center(
child: Text(
'Fade In Out',
style: TextStyle(color: Colors.white, fontSize: 24),
),
),
),
);
},
animation: _animation,
);
}
}
在这个示例中,我们创建了一个FadeInOutAnimationExample
组件,它使用Animator
和AnimatedOpacity
来实现淡入淡出的动画效果。Animator
组件用于管理动画,而AnimatedOpacity
则用于根据动画值调整其子组件的透明度。
注意:
AnimationController
用于控制动画的时长和循环。Tween
用于定义动画的起始和结束值。CurveTween
和Curves.easeInOut
用于定义动画的缓动效果。Animator
的builder
回调函数接收动画值,并返回需要应用动画效果的Widget。
这个示例演示了如何使用animator
插件来实现基本的动画效果。你可以根据实际需求进一步调整和扩展这个示例。