You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:52:04