fix(player): 完善进度预览清屏与下拉刷新
This commit is contained in:
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({
|
||||
|
||||
Reference in new issue
Block a user