Flutter MCQ应用:实现选中选项的指向手动画效果
实现MCQ选项选中时的手指指向动画
这里给你两种可行的实现方案,直接基于你现有代码改造:
方案一:系统图标+基础动画
用Flutter自带的指针图标,配合动画组件实现淡入淡出+位移效果,贴合参考样式:
bool isSelectedUser = person.uid == toUserRef.uid; String name = '${person.firstName} ${person.lastName}'; return Stack( // 根据参考图调整手指位置,比如放在按钮右上方 alignment: const Alignment(1.2, -0.8), children: [ SizedBox( width: 170, height: 70, child: TextButton( onPressed: () { // 这里补充选中逻辑,更新选中状态(比如setState更新toUserRef) }, style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), side: const BorderSide(color: Colors.white), ), ), backgroundColor: MaterialStateProperty.all<Color>( isSelectedUser ? Colors.white.withOpacity(0.8) : Colors.white.withOpacity(0.3), ), ), child: Text( name, maxLines: 2, style: const TextStyle(color: Colors.black, fontSize: 16), ), ), ), // 手指动画元素 AnimatedOpacity( opacity: isSelectedUser ? 1.0 : 0.0, duration: const Duration(milliseconds: 300), child: AnimatedContainer( duration: const Duration(milliseconds: 300), // 未选中时偏移到视野外,选中时回到目标位置 transform: isSelectedUser ? Matrix4.identity() : Matrix4.translationValues(20, -20, 0), child: const Icon( Icons.pointer, size: 35, color: Colors.deepOrange, ), ), ), ], );
方案二:Lottie动画(更贴近参考效果)
如果需要更生动的手指动效,用Lottie加载专业的动画文件:
- 先在
pubspec.yaml添加依赖:
dependencies: lottie: ^2.6.0
- 把下载好的手指指向Lottie动画文件(可从免费动画资源平台获取)放到
assets/lottie/目录,然后在pubspec.yaml声明资源:
flutter: assets: - assets/lottie/pointer_animate.json
- 改造代码:
bool isSelectedUser = person.uid == toUserRef.uid; String name = '${person.firstName} ${person.lastName}'; return Stack( alignment: const Alignment(1.2, -0.8), children: [ SizedBox( width: 170, height: 70, child: TextButton( onPressed: () { // 补充选中状态更新逻辑 }, style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), side: const BorderSide(color: Colors.white), ), ), backgroundColor: MaterialStateProperty.all<Color>( isSelectedUser ? Colors.white.withOpacity(0.8) : Colors.white.withOpacity(0.3), ), ), child: Text( name, maxLines: 2, style: const TextStyle(color: Colors.black, fontSize: 16), ), ), ), // 仅在选中时显示Lottie动画 if (isSelectedUser) Lottie.asset( 'assets/lottie/pointer_animate.json', width: 45, height: 45, repeat: true, // 循环播放动画 ), ], );
注意事项
- 调整
Stack的alignment参数可以精准控制手指的位置,匹配你的UI需求 - 两种方案都依赖
isSelectedUser状态的更新,确保点击按钮时通过setState或状态管理工具(比如Provider、Riverpod)更新选中状态 - 方案一的动画参数(时长、位移量)可以根据需要调整,让过渡更自然
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

