diff --git a/lib/packages/ui/src/widgets/media/thunder_image_viewer.dart b/lib/packages/ui/src/widgets/media/thunder_image_viewer.dart index 504de106a..87e39bf27 100644 --- a/lib/packages/ui/src/widgets/media/thunder_image_viewer.dart +++ b/lib/packages/ui/src/widgets/media/thunder_image_viewer.dart @@ -308,14 +308,15 @@ class _ThunderImageViewerState extends State with TickerProv } Offset _anchoredOffsetForScale({ - required Offset anchor, + required Offset baseAnchor, + required Offset targetAnchor, required Offset baseOffset, required double baseScale, required double targetScale, }) { final viewportCenter = _viewportSize.center(Offset.zero); - final contentPoint = (anchor - viewportCenter - baseOffset) / baseScale; - final targetOffset = anchor - viewportCenter - contentPoint * targetScale; + final contentPoint = (baseAnchor - viewportCenter - baseOffset) / baseScale; + final targetOffset = targetAnchor - viewportCenter - contentPoint * targetScale; return _clampOffset(targetOffset, _baseContentSize, targetScale); } @@ -332,6 +333,10 @@ class _ThunderImageViewerState extends State with TickerProv } double _nextDoubleTapScale() { + if (_scale >= widget.maxScale - _gestureEpsilon) { + return widget.minScale; + } + for (final scale in widget.doubleTapScales) { if (_scale < scale - _gestureEpsilon) { return scale.clamp(widget.minScale, widget.maxScale); @@ -346,7 +351,8 @@ class _ThunderImageViewerState extends State with TickerProv final targetOffset = targetScale <= widget.minScale + _gestureEpsilon ? Offset.zero : _anchoredOffsetForScale( - anchor: anchor, + baseAnchor: anchor, + targetAnchor: anchor, baseOffset: _offset, baseScale: _scale, targetScale: targetScale, @@ -376,7 +382,8 @@ class _ThunderImageViewerState extends State with TickerProv final targetOffset = targetScale <= widget.minScale + _gestureEpsilon ? Offset.zero : _anchoredOffsetForScale( - anchor: anchor, + baseAnchor: anchor, + targetAnchor: anchor, baseOffset: _doubleTapBaseOffset, baseScale: _doubleTapBaseScale, targetScale: targetScale, @@ -526,7 +533,8 @@ class _ThunderImageViewerState extends State with TickerProv final nextOffset = nextScale <= widget.minScale + _gestureEpsilon ? Offset.zero : _anchoredOffsetForScale( - anchor: focalPoint, + baseAnchor: gestureStartFocalPoint, + targetAnchor: focalPoint, baseOffset: _gestureStartOffset, baseScale: _gestureStartScale, targetScale: nextScale, diff --git a/lib/src/shared/content/widgets/media/experimental_image_viewer.dart b/lib/src/shared/content/widgets/media/experimental_image_viewer.dart index 568e4a67b..4ca62fa61 100644 --- a/lib/src/shared/content/widgets/media/experimental_image_viewer.dart +++ b/lib/src/shared/content/widgets/media/experimental_image_viewer.dart @@ -324,14 +324,7 @@ class _ExperimentalImageViewerState extends State { opacity: _isChromeVisible ? 1 : 0, child: IgnorePointer( ignoring: !_isChromeVisible, - child: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Colors.black54, Colors.transparent], - ), - ), + child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Row( children: [ @@ -370,14 +363,7 @@ class _ExperimentalImageViewerState extends State { opacity: _isChromeVisible ? 1 : 0, child: IgnorePointer( ignoring: !_isChromeVisible, - child: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Colors.transparent, Colors.black54], - ), - ), + child: Padding( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly,