Flutter中如何实现答对题目后自动显示并隐藏0.5秒Lottie成功动画?
解决方案:快速显示隐藏Lottie成功动画
核心思路
放弃showDialog,改用Stack叠加层或Overlay嵌入Lottie动画,规避Dialog自带的入场/退场动画,实现0.5秒快速显示后自动隐藏的轻量反馈效果。
具体实现步骤(Flutter为例)
1. 引入依赖
确保pubspec.yaml中添加Lottie依赖:
dependencies: lottie: ^2.7.0
2. 用Stack实现动画层
在游戏页面布局里,通过Stack将动画层叠在题目、输入框上方,默认隐藏,答对时触发显示并自动隐藏:
class MathGamePage extends StatefulWidget { @override _MathGamePageState createState() => _MathGamePageState(); } class _MathGamePageState extends State<MathGamePage> { bool _showSuccessAnim = false; // 自定义变量:当前题目、用户输入内容等 void _checkAnswer() { // 此处替换为你的答案判断逻辑 bool answerIsCorrect = true; if (answerIsCorrect) { setState(() => _showSuccessAnim = true); // 0.5秒后自动隐藏动画并生成下一题 Future.delayed(const Duration(milliseconds: 500), () { setState(() => _showSuccessAnim = false); _generateNewQuestion(); }); } } void _generateNewQuestion() { // 生成新题目的逻辑 } @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ // 游戏主内容区:题目、输入框、提交按钮 Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text("12 × 3 = ?"), TextField(decoration: const InputDecoration(hintText: "输入答案")), ElevatedButton(onPressed: _checkAnswer, child: const Text("提交")), ], ), ), // Lottie成功动画层 if (_showSuccessAnim) Center( child: Lottie.asset( "assets/success_anim.json", // 替换为你的动画文件路径 width: 150, height: 150, fit: BoxFit.contain, ), ), ], ), ); } }
3. 优化动画过渡效果
如果需要更自然的淡入效果,可给Lottie添加AnimatedOpacity:
if (_showSuccessAnim) Center( child: AnimatedOpacity( opacity: _showSuccessAnim ? 1.0 : 0.0, duration: const Duration(milliseconds: 100), child: Lottie.asset( "assets/success_anim.json", width: 150, height: 150, fit: BoxFit.contain, ), ), ),
为何不使用showDialog?
showDialog默认自带弹窗的入场、退场动画,时长无法精准控制到0.5秒内,且弹窗会强制遮挡页面并添加背景阴影,不符合你需要的“快速反馈后立即继续游戏”的轻量交互需求。
内容的提问来源于stack exchange,提问作者Andres Almeida
相关产品推荐
相关产品推荐

