fix(player): 完善进度预览清屏与下拉刷新

This commit is contained in:
Zhou Weidong committed 2026-10-23 03:18:24 +08:00
1 parent 9b1afbdb36
commit f8500bbaca
15 files changed
+949 -251

No files matched your search

@@ -11,8 +11,9 @@ import '../../../core/data/services/sprite_thumbnail_axis.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/widgets/remote_image.dart';
const double scrubPreviewWidth = 120;
const double scrubPreviewWidth = 96;
const double scrubPreviewSafeMargin = 12;
const double _portraitFrameAspect = 9 / 16;
/// 把预览卡片限制在进度条可用宽度内。
double scrubPreviewLeft({
@@ -64,6 +65,7 @@ class _ScrubPreviewCardState extends State<ScrubPreviewCard> {
void initState() {
super.initState();
widget.spriteAxisService?.addListener(_handleSpriteAxisChanged);
_prepareSprite();
_syncFallbackSource();
}
@@ -74,6 +76,10 @@ class _ScrubPreviewCardState extends State<ScrubPreviewCard> {
oldWidget.spriteAxisService?.removeListener(_handleSpriteAxisChanged);
widget.spriteAxisService?.addListener(_handleSpriteAxisChanged);
}
if (oldWidget.thumbnailsUrl != widget.thumbnailsUrl ||
oldWidget.position != widget.position) {
_prepareSprite();
}
if (oldWidget.service != widget.service ||
oldWidget.episodeId != widget.episodeId ||
oldWidget.thumbnailsUrl != widget.thumbnailsUrl) {
@@ -97,6 +103,12 @@ class _ScrubPreviewCardState extends State<ScrubPreviewCard> {
super.dispose();
}
void _prepareSprite() {
final service = widget.spriteAxisService;
if (service == null) return;
unawaited(service.prepareAt(widget.thumbnailsUrl, widget.position));
}
void _handleSpriteAxisChanged() {
if (!mounted) return;
if (_spriteFrame != null) {
@@ -190,7 +202,8 @@ class _ScrubPreviewCardState extends State<ScrubPreviewCard> {
),
),
AspectRatio(
aspectRatio: 16 / 9,
key: const Key('scrub-preview-frame-box'),
aspectRatio: _frameAspect(spriteFrame),
child: Stack(
fit: StackFit.expand,
children: [
@@ -229,6 +242,14 @@ class _ScrubPreviewCardState extends State<ScrubPreviewCard> {
}
}
double _frameAspect(SpriteThumbnailFrame? frame) {
final rect = frame?.sourceRect;
if (rect == null || rect.width <= 0 || rect.height <= 0) {
return _portraitFrameAspect;
}
return rect.width / rect.height;
}
/// 对已解码 sprite 做 sourceRect 裁剪,不触发再次解码。
class SpriteCropPreview extends StatelessWidget {
const SpriteCropPreview({