Flutter - 打字动画
Flutter - Typing Text animation
对于我的每个文本小部件,我实际上希望输入文本而不是立即显示文本。有没有比使用变量并在 setState() 中添加变量更简单的方法?
谢谢
这可能是 AnimatedBuilder
的一个很好的用例。这将使您能够更轻松地控制打字动画的持续时间,并且仅在长度发生变化时重建您的小部件。这是一个如何做到这一点的例子。
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primaryColor: const Color.fromARGB(255, 0, 199, 0),
accentColor: const Color.fromARGB(255, 222, 233, 226),
brightness: Brightness.dark,
canvasColor: Colors.black,
),
home: new MyHomePage(),
debugShowCheckedModeBanner: false,
);
}
}
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
Animation<int> _characterCount;
int _stringIndex;
static const List<String> _kStrings = const <String>[
'Call trans opt: received. 2-19-98 13:24:18 REC:Log>',
'Trace program running.',
'[312]555-0690',
];
String get _currentString => _kStrings[_stringIndex % _kStrings.length];
@override
Widget build(BuildContext context) {
ThemeData theme = Theme.of(context);
TextStyle textStyle = theme.textTheme.title.copyWith(
fontFamily: 'Courier New',
color: theme.primaryColor,
);
return new Scaffold(
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.navigate_next),
onPressed: () async {
AnimationController controller = new AnimationController(
duration: const Duration(milliseconds: 4000),
vsync: this,
);
setState(() {
_stringIndex = _stringIndex == null ? 0 : _stringIndex + 1;
_characterCount = new StepTween(begin: 0, end: _currentString.length)
.animate(new CurvedAnimation(parent: controller, curve: Curves.easeIn));
});
await controller.forward();
controller.dispose();
},
),
body: new Container(
margin: new EdgeInsets.symmetric(vertical: 50.0, horizontal: 10.0),
child: _characterCount == null ? null : new AnimatedBuilder(
animation: _characterCount,
builder: (BuildContext context, Widget child) {
String text = _currentString.substring(0, _characterCount.value);
return new Text(text, style: textStyle);
},
),
),
);
}
}
如果您打算经常使用这个动画文本小部件,可以使用 AnimatedWidget 将其重构为一个单独的 class。
你可以使用这个插件
animated_text_kit:
示例:https://github.com/aagarwal1012/Animated-Text-Kit
一段代码:
SizedBox(
width: 250.0,
child: TypewriterAnimatedTextKit(
onTap: () {
print("Tap Event");
},
text: [
"Discipline is the best tool",
"Design first, then code",
"Do not patch bugs out, rewrite them",
"Do not test bugs out, design them out",
],
textStyle: TextStyle(
fontSize: 30.0,
fontFamily: "Agne"
),
textAlign: TextAlign.start,
alignment: AlignmentDirectional.topStart // or Alignment.topLeft
),
);
自定义持续时间的最简单方法,使用这个插件 animated_text_kit: ^4.2.1
import 'package:animated_text_kit/animated_text_kit.dart';
您必须使用的代码是
SizedBox(
width: 250.0,
child: DefaultTextStyle(
style: const TextStyle(
fontSize: 30.0,
fontFamily: 'popin',
),
child: AnimatedTextKit(isRepeatingAnimation: true, animatedTexts: [
TyperAnimatedText('When you talk, you are only repeating',
speed: Duration(milliseconds: 100)),
TyperAnimatedText('something you know.But if you listen,',
speed: Duration(milliseconds: 100)),
]),
),
),
对于我的每个文本小部件,我实际上希望输入文本而不是立即显示文本。有没有比使用变量并在 setState() 中添加变量更简单的方法?
谢谢
这可能是 AnimatedBuilder
的一个很好的用例。这将使您能够更轻松地控制打字动画的持续时间,并且仅在长度发生变化时重建您的小部件。这是一个如何做到这一点的例子。
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primaryColor: const Color.fromARGB(255, 0, 199, 0),
accentColor: const Color.fromARGB(255, 222, 233, 226),
brightness: Brightness.dark,
canvasColor: Colors.black,
),
home: new MyHomePage(),
debugShowCheckedModeBanner: false,
);
}
}
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
Animation<int> _characterCount;
int _stringIndex;
static const List<String> _kStrings = const <String>[
'Call trans opt: received. 2-19-98 13:24:18 REC:Log>',
'Trace program running.',
'[312]555-0690',
];
String get _currentString => _kStrings[_stringIndex % _kStrings.length];
@override
Widget build(BuildContext context) {
ThemeData theme = Theme.of(context);
TextStyle textStyle = theme.textTheme.title.copyWith(
fontFamily: 'Courier New',
color: theme.primaryColor,
);
return new Scaffold(
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.navigate_next),
onPressed: () async {
AnimationController controller = new AnimationController(
duration: const Duration(milliseconds: 4000),
vsync: this,
);
setState(() {
_stringIndex = _stringIndex == null ? 0 : _stringIndex + 1;
_characterCount = new StepTween(begin: 0, end: _currentString.length)
.animate(new CurvedAnimation(parent: controller, curve: Curves.easeIn));
});
await controller.forward();
controller.dispose();
},
),
body: new Container(
margin: new EdgeInsets.symmetric(vertical: 50.0, horizontal: 10.0),
child: _characterCount == null ? null : new AnimatedBuilder(
animation: _characterCount,
builder: (BuildContext context, Widget child) {
String text = _currentString.substring(0, _characterCount.value);
return new Text(text, style: textStyle);
},
),
),
);
}
}
如果您打算经常使用这个动画文本小部件,可以使用 AnimatedWidget 将其重构为一个单独的 class。
你可以使用这个插件
animated_text_kit:
示例:https://github.com/aagarwal1012/Animated-Text-Kit
一段代码:
SizedBox(
width: 250.0,
child: TypewriterAnimatedTextKit(
onTap: () {
print("Tap Event");
},
text: [
"Discipline is the best tool",
"Design first, then code",
"Do not patch bugs out, rewrite them",
"Do not test bugs out, design them out",
],
textStyle: TextStyle(
fontSize: 30.0,
fontFamily: "Agne"
),
textAlign: TextAlign.start,
alignment: AlignmentDirectional.topStart // or Alignment.topLeft
),
);
自定义持续时间的最简单方法,使用这个插件 animated_text_kit: ^4.2.1
import 'package:animated_text_kit/animated_text_kit.dart';
您必须使用的代码是
SizedBox(
width: 250.0,
child: DefaultTextStyle(
style: const TextStyle(
fontSize: 30.0,
fontFamily: 'popin',
),
child: AnimatedTextKit(isRepeatingAnimation: true, animatedTexts: [
TyperAnimatedText('When you talk, you are only repeating',
speed: Duration(milliseconds: 100)),
TyperAnimatedText('something you know.But if you listen,',
speed: Duration(milliseconds: 100)),
]),
),
),