Flutter 动画文本
一个 Flutter 包,其中包含一些炫酷且出色的文本动画。在 Codemagic 的电子书《我们喜爱的 Flutter 库》中推荐的文本动画包。试试我们的实时示例应用程序。
安装
- 依赖它
将此添加到您的包的pubspec.yaml文件中
dependencies:
animated_text_kit: ^4.2.2
- 安装它
您可以从命令行安装包
通过 pub
$ pub get
使用 Flutter
$ flutter pub get
- 导入它
现在,在您的 Dart 代码中,您可以使用
import 'package:animated_text_kit/animated_text_kit.dart';
用法
AnimatedTextKit 是一个生成文本动画的有状态小部件。在你的 build 方法中这样包含它:
AnimatedTextKit(
animatedTexts: [
TypewriterAnimatedText(
'Hello world!',
textStyle: const TextStyle(
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
speed: const Duration(milliseconds: 2000),
),
],
totalRepeatCount: 4,
pause: const Duration(milliseconds: 1000),
displayFullTextOnTap: true,
stopPauseOnTap: true,
)
它有许多可配置的属性,包括:
-
pause – 动画文本之间的暂停时间
-
displayFullTextOnTap – 点击动画将使其快速完成
-
isRepeatingAnimation – 控制动画是否重复
-
repeatForever – 控制动画是否永远重复
-
totalRepeatCount – 动画应重复的次数(当 repeatForever 为 false 时)
还有自定义回调函数:
-
onTap – 当用户点击动画文本时调用此函数
-
onNext(int index, bool isLast) – 在前一个文本暂停后,在下一个文本动画之前调用
-
onNextBeforePause(int index, bool isLast) – 在前一个文本暂停之前,在下一个文本动画之前调用
-
onFinished – 当 isRepeatingAnimation 参数设置为 false 时,在结束时调用
注意:你可能会遇到一个问题,即文本没有像这里所示的那样通过 setState 进行更新。解决方案是使用一个基于文本变化的 key。有关参考,请观看此视频。
3.0 版本新增功能
3.0 版本重构了代码,将公共动画控件移至 AnimatedTextKit,并且除 TextLiquidFill 外,所有动画都继承自 AnimatedText。这节省了数百行重复的代码,提高了动画之间的一致性,并使创建新动画更加容易。
它还使动画更加灵活,因为现在可以轻松组合多种动画。例如:
AnimatedTextKit(
animatedTexts: [
FadeAnimatedText(
'Fade First',
textStyle: TextStyle(fontSize: 32.0, fontWeight: FontWeight.bold),
),
ScaleAnimatedText(
'Then Scale',
textStyle: TextStyle(fontSize: 70.0, fontFamily: 'Canterbury'),
),
],
),
使用旧的 FadeAnimatedTextKit 等同于将 AnimatedTextKit 与 FadeAnimatedText 一起使用。AnimatedTextKit 的一个优点是 animatedTexts 可以是 AnimatedText 的任何子类,而使用 FadeAnimatedTextKit essentially 将你限制为仅使用 FadeAnimatedText。
旧的 AnimatedTextKit 类
你是否注意到动画类成对出现?例如,有 FadeAnimatedText 和 FadeAnimatedTextKit。3.0 版本的重要重构将原始的 FadeAnimatedTextKit 分裂为 FadeAnimatedText 和一个可重用的 AnimatedTextKit,然后调整了 FadeAnimatedTextKit 以向后兼容。
当引入新的 AnimationText 子类时,你可能会想知道是否也需要引入一个额外的 Kit 类。答案是 NO。?
今后,我们将提倡采用 3.0 版本的方法,并已弃用旧的 Kit 类。这将使创建新动画更容易。我们知道这会让一些旧代码变得冗长,但灵活性和简洁性是一个有意识的权衡。
动画
提供了许多动画,但你也可以创建自己的动画。
旋转
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(width: 20.0, height: 100.0),
const Text(
'Be',
style: TextStyle(fontSize: 43.0),
),
const SizedBox(width: 20.0, height: 100.0),
DefaultTextStyle(
style: const TextStyle(
fontSize: 40.0,
fontFamily: 'Horizon',
),
child: AnimatedTextKit(
animatedTexts: [
RotateAnimatedText('AWESOME'),
RotateAnimatedText('OPTIMISTIC'),
RotateAnimatedText('DIFFERENT'),
],
onTap: () {
print("Tap Event");
},
),
),
],
);
注意:你可以通过为 RotateAnimatedTextKit 类设置 transitionHeight 参数的值来覆盖过渡高度。
淡入淡出
return SizedBox(
width: 250.0,
child: DefaultTextStyle(
style: const TextStyle(
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
child: AnimatedTextKit(
animatedTexts: [
FadeAnimatedText('do IT!'),
FadeAnimatedText('do it RIGHT!!'),
FadeAnimatedText('do it RIGHT NOW!!!'),
],
onTap: () {
print("Tap Event");
},
),
),
);
打字机
return SizedBox(
width: 250.0,
child: DefaultTextStyle(
style: const TextStyle(
fontSize: 30.0,
fontFamily: 'Bobbers',
),
child: AnimatedTextKit(
animatedTexts: [
TyperAnimatedText('It is not enough to do your best,'),
TyperAnimatedText('you must know what to do,'),
TyperAnimatedText('and then do your best'),
TyperAnimatedText('- W.Edwards Deming'),
],
onTap: () {
print("Tap Event");
},
),
),
);