diff --git a/lib/widgets/album/thumbnail/raster.dart b/lib/widgets/album/thumbnail/raster.dart index 2ca5f40f7..ef9e615d4 100644 --- a/lib/widgets/album/thumbnail/raster.dart +++ b/lib/widgets/album/thumbnail/raster.dart @@ -80,6 +80,7 @@ class _ThumbnailRasterImageState extends State { @override Widget build(BuildContext context) { final fastImage = Image( + key: const ValueKey('LQ'), image: _fastThumbnailProvider, width: extent, height: extent, @@ -88,16 +89,24 @@ class _ThumbnailRasterImageState extends State { final image = _sizedThumbnailProvider == null ? fastImage : Image( + key: const ValueKey('HQ'), frameBuilder: (context, child, frame, wasSynchronouslyLoaded) { if (wasSynchronouslyLoaded) return child; return AnimatedSwitcher( duration: const Duration(milliseconds: 200), - transitionBuilder: (child, animation) => child == fastImage - ? child - : FadeTransition( - opacity: animation, - child: child, - ), + transitionBuilder: (child, animation) { + var shouldFade = true; + if (child is Image && child.image == _fastThumbnailProvider) { + // directly show LQ thumbnail, only fade when switching from LQ to HQ + shouldFade = false; + } + return shouldFade + ? FadeTransition( + opacity: animation, + child: child, + ) + : child; + }, child: frame == null ? fastImage : child, ); }, diff --git a/lib/widgets/fullscreen/fullscreen_body.dart b/lib/widgets/fullscreen/fullscreen_body.dart index 445143a61..81639692d 100644 --- a/lib/widgets/fullscreen/fullscreen_body.dart +++ b/lib/widgets/fullscreen/fullscreen_body.dart @@ -74,7 +74,7 @@ class FullscreenBodyState extends State with SingleTickerProvide _horizontalPager = PageController(initialPage: _currentHorizontalPage); _verticalPager = PageController(initialPage: _currentVerticalPage.value)..addListener(_onVerticalPageControllerChange); _overlayAnimationController = AnimationController( - duration: const Duration(milliseconds: 300), + duration: const Duration(milliseconds: 200), vsync: this, ); _topOverlayScale = CurvedAnimation( @@ -316,10 +316,14 @@ class FullscreenBodyState extends State with SingleTickerProvide await _onOverlayVisibleChange(); } - Future _onOverlayVisibleChange() async { + Future _onOverlayVisibleChange({bool animate = true}) async { if (_overlayVisible.value) { _showSystemUI(); - _overlayAnimationController.forward(); + if (animate) { + _overlayAnimationController.forward(); + } else { + _overlayAnimationController.value = _overlayAnimationController.upperBound; + } } else { final mediaQuery = Provider.of(context, listen: false); setState(() { @@ -327,7 +331,11 @@ class FullscreenBodyState extends State with SingleTickerProvide _frozenViewPadding = mediaQuery.viewPadding; }); _hideSystemUI(); - await _overlayAnimationController.reverse(); + if (animate) { + await _overlayAnimationController.reverse(); + } else { + _overlayAnimationController.reset(); + } setState(() { _frozenViewInsets = null; _frozenViewPadding = null;