diff --git a/frontend/mobile-app/lib/features/authorization/presentation/widgets/stickman_race_widget.dart b/frontend/mobile-app/lib/features/authorization/presentation/widgets/stickman_race_widget.dart index a157cb4d..a2cf4d49 100644 --- a/frontend/mobile-app/lib/features/authorization/presentation/widgets/stickman_race_widget.dart +++ b/frontend/mobile-app/lib/features/authorization/presentation/widgets/stickman_race_widget.dart @@ -83,7 +83,7 @@ class _StickmanRaceWidgetState extends State } return Container( - margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: const Color(0x80FFFFFF), @@ -159,14 +159,21 @@ class _StickmanRaceWidgetState extends State ); } + /// 每个火柴人需要的最小高度(标签+动画+昵称) + static const double _minTrackHeight = 85.0; + /// 构建赛道区域 Widget _buildRaceTrack() { // 按完成数量排序 final sortedRankings = List.from(widget.rankings) ..sort((a, b) => b.completedCount.compareTo(a.completedCount)); + // 根据火柴人数量动态计算赛道高度 + final trackCount = sortedRankings.length; + final raceTrackHeight = (trackCount * _minTrackHeight).clamp(160.0, 500.0); + return SizedBox( - height: 160, + height: raceTrackHeight, child: Stack( children: [ // 背景赛道线 @@ -208,7 +215,7 @@ class _StickmanRaceWidgetState extends State ...sortedRankings.asMap().entries.map((entry) { final index = entry.key; final data = entry.value; - return _buildStickman(data, index, sortedRankings.length); + return _buildStickman(data, index, sortedRankings.length, raceTrackHeight); }), ], ), @@ -216,12 +223,14 @@ class _StickmanRaceWidgetState extends State } /// 构建单个火柴人 - Widget _buildStickman(StickmanRankingData data, int rank, int total) { + Widget _buildStickman(StickmanRankingData data, int rank, int total, double raceTrackHeight) { // 计算水平位置 (根据进度) final horizontalProgress = data.progress; // 计算垂直位置 (不同排名在不同跑道) - final trackHeight = 120.0 / total; + // 预留顶部和底部空间 + final usableHeight = raceTrackHeight - 40; + final trackHeight = usableHeight / total; final verticalPosition = rank * trackHeight + 10; return AnimatedBuilder(