Flutter元素选中效果实现求助:复现视频所示交互效果
Flutter 元素选中效果复现方案
先明确视频里的核心效果:元素被选中时会呈现高亮边框+轻微缩放的反馈,且整个过程带有平滑过渡动画。以下是具体实现方案:
核心实现思路
- 用
StatefulWidget维护选中状态 - 通过
AnimatedContainer实现边框样式和元素大小的平滑过渡 - 借助
GestureDetector监听点击事件来切换选中状态
完整代码示例
import 'package:flutter/material.dart'; class SelectableItem extends StatefulWidget { final Widget child; final double borderRadius; final Color selectedBorderColor; final double selectedBorderWidth; final double scaleFactor; const SelectableItem({ super.key, required this.child, this.borderRadius = 8.0, this.selectedBorderColor = Colors.blue, this.selectedBorderWidth = 2.0, this.scaleFactor = 1.05, }); @override State<SelectableItem> createState() => _SelectableItemState(); } class _SelectableItemState extends State<SelectableItem> { bool _isSelected = false; @override Widget build(BuildContext context) { return GestureDetector( onTap: () => setState(() => _isSelected = !_isSelected), child: AnimatedContainer( duration: const Duration(milliseconds: 200), curve: Curves.easeInOut, transform: Matrix4.diagonal3Values( _isSelected ? widget.scaleFactor : 1.0, _isSelected ? widget.scaleFactor : 1.0, 1.0, ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(widget.borderRadius), border: _isSelected ? Border.all( color: widget.selectedBorderColor, width: widget.selectedBorderWidth, ) : null, ), child: widget.child, ), ); } } // 使用示例 void main() { runApp(const MaterialApp( home: Scaffold( body: Center( child: SelectableItem( child: Padding( padding: EdgeInsets.all(16.0), child: Text("可选中元素"), ), ), ), ), )); }
关键细节说明
- 动画优化:通过
AnimatedContainer的duration和curve参数调整动画速度与缓动效果,还原视频中的流畅感 - 状态管理:点击时调用
setState更新_isSelected状态,自动触发容器的样式和大小变化 - 自定义适配:可修改
selectedBorderColor、scaleFactor等参数,匹配不同的设计需求
内容的提问来源于stack exchange,提问作者Danilo Souza
相关产品推荐
相关产品推荐

