feat(mobile): 优化火柴人赛跑组件布局

- 将昵称移到左侧固定位置,与右边红旗相呼应
- 缩小数量标签与动画之间的间距

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-24 00:28:01 -08:00
parent bf64391c0c
commit 5ed1a0b143
1 changed files with 71 additions and 56 deletions

View File

@ -240,74 +240,89 @@ class _StickmanRaceWidgetState extends State<StickmanRaceWidget>
final containerWidth = screenWidth - 32 - 32; // padding + padding final containerWidth = screenWidth - 32 - 32; // padding + padding
final stickmanHalfWidth = 30.0; // final stickmanHalfWidth = 30.0; //
final flagAreaWidth = 40.0; // right:824+ final flagAreaWidth = 40.0; // right:824+
final availableWidth = containerWidth - flagAreaWidth - stickmanHalfWidth; final nicknameAreaWidth = 65.0; //
final leftPosition = availableWidth * horizontalProgress; final availableWidth = containerWidth - flagAreaWidth - stickmanHalfWidth - nicknameAreaWidth;
final leftPosition = nicknameAreaWidth + availableWidth * horizontalProgress;
return Positioned( return Positioned(
left: leftPosition.clamp(0.0, availableWidth), // left: 0,
top: verticalPosition - bounce, top: verticalPosition - bounce,
child: Column( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
// // -
Container( SizedBox(
constraints: const BoxConstraints(maxWidth: 60), width: nicknameAreaWidth,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), child: Container(
decoration: BoxDecoration( padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
color: data.isCurrentUser decoration: BoxDecoration(
? const Color(0xFFD4AF37) color: data.isCurrentUser
: const Color(0xFF8B5A2B), ? const Color(0xFFD4AF37).withValues(alpha: 0.2)
borderRadius: BorderRadius.circular(8), : Colors.white.withValues(alpha: 0.8),
), borderRadius: BorderRadius.circular(4),
child: FittedBox( border: data.isCurrentUser
fit: BoxFit.scaleDown, ? Border.all(color: const Color(0xFFD4AF37), width: 1)
: null,
),
child: Text( child: Text(
'${_formatNumber(data.completedCount)}', data.nickname,
style: const TextStyle( style: TextStyle(
fontSize: 9, fontSize: 9,
fontFamily: 'Inter', fontFamily: 'Inter',
fontWeight: FontWeight.w600, fontWeight:
color: Colors.white, data.isCurrentUser ? FontWeight.w600 : FontWeight.w400,
color: data.isCurrentUser
? const Color(0xFFD4AF37)
: const Color(0xFF5D4037),
), ),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
), ),
), ),
), ),
const SizedBox(height: 2), //
SizedBox(
// width: leftPosition - nicknameAreaWidth + stickmanHalfWidth * 2,
RunningStickman( child: Row(
size: 36, mainAxisAlignment: MainAxisAlignment.end,
color: data.isCurrentUser children: [
? const Color(0xFFD4AF37) Column(
: const Color(0xFF5D4037), mainAxisSize: MainAxisSize.min,
), children: [
//
// Container(
Container( constraints: const BoxConstraints(maxWidth: 60),
constraints: const BoxConstraints(maxWidth: 60), padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), decoration: BoxDecoration(
decoration: BoxDecoration( color: data.isCurrentUser
color: data.isCurrentUser ? const Color(0xFFD4AF37)
? const Color(0xFFD4AF37).withValues(alpha: 0.2) : const Color(0xFF8B5A2B),
: Colors.white.withValues(alpha: 0.8), borderRadius: BorderRadius.circular(8),
borderRadius: BorderRadius.circular(4), ),
border: data.isCurrentUser child: FittedBox(
? Border.all(color: const Color(0xFFD4AF37), width: 1) fit: BoxFit.scaleDown,
: null, child: Text(
), '${_formatNumber(data.completedCount)}',
child: Text( style: const TextStyle(
data.nickname, fontSize: 9,
style: TextStyle( fontFamily: 'Inter',
fontSize: 9, fontWeight: FontWeight.w600,
fontFamily: 'Inter', color: Colors.white,
fontWeight: ),
data.isCurrentUser ? FontWeight.w600 : FontWeight.w400, ),
color: data.isCurrentUser ),
? const Color(0xFFD4AF37) ),
: const Color(0xFF5D4037), // -
), RunningStickman(
overflow: TextOverflow.ellipsis, size: 36,
textAlign: TextAlign.center, color: data.isCurrentUser
? const Color(0xFFD4AF37)
: const Color(0xFF5D4037),
),
],
),
],
), ),
), ),
], ],