fix(player): 改用墙钟驱动飘心动画

This commit is contained in:
Zhou Weidong committed 2026-10-26 19:07:56 +08:00
1 parent c0f65042e6
commit 978c309cd7
6 files changed
+235 -100

No files matched your search

+66 -20
View File
@@ -13,21 +13,26 @@ void main() {
var completedCalls = 0;
const origin = Offset(300, 546);
final clock = _HeartClock();
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Stack(
fit: StackFit.expand,
clipBehavior: Clip.none,
children: [
Positioned.fill(
child: PlayerDoubleTapHeartBurst(
burstId: 91,
origin: origin,
onCompleted: () => completedCalls++,
home: TickerMode(
enabled: false,
child: Scaffold(
body: Stack(
fit: StackFit.expand,
clipBehavior: Clip.none,
children: [
Positioned.fill(
child: PlayerDoubleTapHeartBurst(
burstId: 91,
origin: origin,
now: clock.now,
onCompleted: () => completedCalls++,
),
),
),
],
],
),
),
),
),
@@ -52,15 +57,56 @@ void main() {
lessThanOrEqualTo(1),
);
await tester.pump(const Duration(milliseconds: 400));
final midpoint = tester.getCenter(firstHeart);
debugPrint(
'[heart-pixels] after400ms center=${midpoint.dx},${midpoint.dy}',
);
expect(midpoint.dy, lessThan(origin.dy - 40));
expect((midpoint.dx - origin.dx).abs(), lessThanOrEqualTo(30));
await _pumpHeartTime(tester, clock, const Duration(milliseconds: 300));
final center300 = tester.getCenter(firstHeart);
debugPrint('[heart-pixels] t=300 center=${center300.dx},${center300.dy}');
expect(center300.dy, lessThan(initialCenter.dy));
expect((center300.dx - origin.dx).abs(), lessThanOrEqualTo(30));
await tester.pump(const Duration(milliseconds: 1200));
await _pumpHeartTime(tester, clock, const Duration(milliseconds: 300));
final center600 = tester.getCenter(firstHeart);
debugPrint('[heart-pixels] t=600 center=${center600.dx},${center600.dy}');
expect(center600.dy, lessThan(center300.dy));
expect((center600.dx - origin.dx).abs(), lessThanOrEqualTo(30));
await _pumpHeartTime(tester, clock, const Duration(milliseconds: 300));
final center900 = tester.getCenter(firstHeart);
debugPrint('[heart-pixels] t=900 center=${center900.dx},${center900.dy}');
expect(center900.dy, lessThan(center600.dy));
expect((center900.dx - origin.dx).abs(), lessThanOrEqualTo(30));
expect({
initialCenter.dy,
center300.dy,
center600.dy,
center900.dy,
}, hasLength(4));
await _pumpHeartTime(tester, clock, const Duration(milliseconds: 700));
expect(completedCalls, 1);
});
}
Future<void> _pumpHeartTime(
WidgetTester tester,
_HeartClock clock,
Duration duration,
) async {
const frameMs = 16;
var remainingMs = duration.inMilliseconds;
while (remainingMs > 0) {
final stepMs = remainingMs >= frameMs ? frameMs : remainingMs;
clock.advance(Duration(milliseconds: stepMs));
await tester.pump(const Duration(milliseconds: frameMs));
remainingMs -= stepMs;
}
}
class _HeartClock {
DateTime _now = DateTime(2026, 10, 26, 12);
DateTime now() => _now;
void advance(Duration duration) {
_now = _now.add(duration);
}
}