Flutter动画图标插件simple_animated_icon的使用
Flutter动画图标插件simple_animated_icon的使用
simple_animated_icon
是一个实现“简单”过渡的Flutter插件,用于Material Design中定义的动画图标。该插件提供了一个 SimpleAnimatedIcon
小部件,可以用于在任何两个Material图标之间进行动画转换。
示例图片
开始使用
-
添加依赖项
首先,在
pubspec.yaml
文件中添加simple_animated_icon
依赖项:dependencies: simple_animated_icon: ^1.1.0
-
导入包
在您的应用程序中导入该包:
import 'package:simple_animated_icon/simple_animated_icon.dart';
-
准备 AnimationController 和 动画进度
准备一个
AnimationController
和一个动画数字来指示动画进度:_animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 300)); _progress = Tween<double>(begin: 0.0, end: 1.0).animate(_animationController);
-
创建动画图标
在
build
方法中,通过提供起始图标、结束图标和_progress
创建动画图标:[@override](/user/override) Widget build(BuildContext context) { return YourWidget( ... child: SimpleAnimatedIcon( startIcon: Icons.add, // 起始图标 endIcon: Icons.close, // 结束图标 progress: _progress, // 动画进度 ), ); }
-
启动或反转动画
通过控制器启动或反转动画:
if (_isOpened) { _animationController.reverse(); // 反转动画 } else { _animationController.forward(); // 启动动画 }
设计目标
SimpleAnimatedIcon
的设计目标是为Flutter中的内置 AnimatedIcon
提供一种替代方案,因此它具有与 AnimatedIcon
相同的接口,并且可以在使用 AnimatedIcon
或 Icon
的任何地方使用。示例项目展示了使用 FloatingActionButton
和 IconButton
的两种用例,但也可以在其他小部件中使用。
由于上述目标,SimpleAnimatedIcon
只接受一个动画控制参数 progress
,其余部分由使用者决定。这给使用者提供了最大的灵活性。
完整示例代码
以下是完整的示例代码,包括 FloatingActionButton
和 IconButton
的动画图标示例:
import 'package:flutter/material.dart';
import 'package:simple_animated_icon/simple_animated_icon.dart';
void main() {
runApp(MyApp());
}
/// 示例:动画FAB
class AnimatedFab extends StatefulWidget {
[@override](/user/override)
_AnimatedFabState createState() => _AnimatedFabState();
}
class _AnimatedFabState extends State<AnimatedFab> with SingleTickerProviderStateMixin {
bool _isOpened = false;
late AnimationController _animationController;
late Animation<Color?> _color;
late Animation<double> _progress;
[@override](/user/override)
void initState() {
super.initState();
_animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 300))
..addListener(() {
// 动画进度时调用 `build`
setState(() {});
});
var curve = CurvedAnimation(
parent: _animationController,
curve: Interval(0.0, 1.0, curve: Curves.easeOut),
);
_progress = Tween<double>(begin: 0.0, end: 1.0).animate(curve);
_color = ColorTween(begin: Colors.blue, end: Colors.red).animate(curve);
}
[@override](/user/override)
void dispose() {
_animationController.dispose();
super.dispose();
}
void animate() {
if (_isOpened) {
_animationController.reverse(); // 反转动画
} else {
_animationController.forward(); // 启动动画
}
setState(() {
_isOpened = !_isOpened;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return FloatingActionButton(
onPressed: animate,
backgroundColor: _color.value, // 动态背景颜色
child: SimpleAnimatedIcon(
startIcon: Icons.add, // 起始图标
endIcon: Icons.close, // 结束图标
progress: _progress, // 动画进度
),
);
}
}
/// 示例:动画图标按钮
class AnimatedIconButton extends StatefulWidget {
[@override](/user/override)
_AnimatedIconButtonState createState() => _AnimatedIconButtonState();
}
class _AnimatedIconButtonState extends State<AnimatedIconButton> with SingleTickerProviderStateMixin {
bool _isOpened = false;
late AnimationController _animationController;
late Animation<double> _progress;
[@override](/user/override)
void initState() {
super.initState();
_animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 300))
..addListener(() {
// 动画进度时调用 `build`
setState(() {});
});
_progress = Tween<double>(begin: 0.0, end: 1.0).animate(_animationController);
}
[@override](/user/override)
void dispose() {
_animationController.dispose();
super.dispose();
}
void animate() {
if (_isOpened) {
_animationController.reverse(); // 反转动画
} else {
_animationController.forward(); // 启动动画
}
setState(() {
_isOpened = !_isOpened;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return IconButton(
onPressed: animate,
iconSize: 48.0, // 图标大小
icon: SimpleAnimatedIcon(
color: Colors.black, // 自定义图标颜色
size: 48.0, // 自定义图标大小
startIcon: Icons.search, // 起始图标
endIcon: Icons.mail, // 结束图标
progress: _progress, // 动画进度
// 多个过渡效果从左到右应用。
// 顺序很重要,特别是当涉及到 `slide_in_*` 过渡时。
transitions: [
Transitions.zoom_in, // 缩放效果
Transitions.slide_in_left // 左滑效果
],
));
}
}
class MyApp extends StatelessWidget {
// 这个小部件是应用程序的根。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Simple Animated Icon Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Simple Animated Icon Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
AnimatedIconButton(), // 动画图标按钮
],
),
),
floatingActionButton: AnimatedFab(), // 动画FAB
);
}
}
更多关于Flutter动画图标插件simple_animated_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画图标插件simple_animated_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用simple_animated_icon
插件的示例代码。simple_animated_icon
是一个用于创建简单动画图标的Flutter插件。这个插件提供了一些预定义的动画效果,如箭头旋转、菜单展开等。
首先,确保你已经在pubspec.yaml
文件中添加了simple_animated_icon
依赖:
dependencies:
flutter:
sdk: flutter
simple_animated_icon: ^0.3.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用SimpleAnimatedIcon
。以下是一个简单的示例,展示了一个旋转箭头的动画图标:
import 'package:flutter/material.dart';
import 'package:simple_animated_icon/simple_animated_icon.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Simple Animated Icon 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;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Simple Animated Icon Demo'),
),
body: Center(
child: SimpleAnimatedIcon(
icon: AnimatedIcons.arrow_menu,
progress: _controller,
color: Colors.blue,
size: 50.0,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 触发动画,这里可以重置动画控制器
_controller.reset();
_controller.forward();
},
tooltip: 'Restart Animation',
child: Icon(Icons.replay),
),
);
}
}
在这个示例中:
- 我们首先导入了
simple_animated_icon
包。 - 创建了一个Flutter应用,并在主页中使用了
SimpleAnimatedIcon
。 - 使用
AnimationController
来控制动画的进度。这里设置动画持续时间为2秒,并且让动画反复播放(repeat(reverse: true)
)。 SimpleAnimatedIcon
使用了AnimatedIcons.arrow_menu
预设的动画图标,并绑定了AnimationController
来控制动画进度。- 在界面中央显示了动画图标,并在底部浮动按钮(FAB)上添加了一个重置动画的功能。
你可以根据需要调整动画图标的类型、颜色、大小等属性。simple_animated_icon
插件提供了多种预设的动画图标,你可以查阅其文档获取更多信息。