From 5db31476fe37d99c71212800be317cce018aa0e2 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 26 Mar 2024 23:11:23 +0100 Subject: [PATCH] #937 viewer: fixed position drift during scale --- CHANGELOG.md | 1 + plugins/aves_magnifier/lib/src/core/core.dart | 8 ++++++-- .../aves_magnifier/lib/src/scale/scale_boundaries.dart | 8 ++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b763c2868..484acbdfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. ### Fixed - crash when decoding large region +- viewer position drift during scale ## [v1.10.7] - 2024-03-12 diff --git a/plugins/aves_magnifier/lib/src/core/core.dart b/plugins/aves_magnifier/lib/src/core/core.dart index 1dd776e67..5f07d13fc 100644 --- a/plugins/aves_magnifier/lib/src/core/core.dart +++ b/plugins/aves_magnifier/lib/src/core/core.dart @@ -220,12 +220,16 @@ class _AvesMagnifierState extends State with TickerProviderStateM newScale = boundaries.clampScale(newScale); } newScale = max(0, newScale); + // focal point is in viewport coordinates final scaleFocalPoint = _doubleTap ? _startFocalPoint! : details.localFocalPoint; + final viewportCenter = boundaries.viewportCenter; + final centerContentPosition = boundaries.viewportToContentPosition(controller, viewportCenter); + final scalePositionDelta = (scaleFocalPoint - viewportCenter) * (scale! / newScale - 1); final panPositionDelta = scaleFocalPoint - _lastViewportFocalPosition!; - final scalePositionDelta = boundaries.viewportToStatePosition(controller, scaleFocalPoint) * (scale! / newScale - 1); + final newPosition = boundaries.clampPosition( - position: position + panPositionDelta + scalePositionDelta, + position: boundaries.contentToStatePosition(newScale, centerContentPosition) + scalePositionDelta + panPositionDelta, scale: newScale, ); diff --git a/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart index f3c12f8f9..39186af8a 100644 --- a/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart +++ b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart @@ -90,16 +90,12 @@ class ScaleBoundaries extends Equatable { double get initialScale => scaleForLevel(_initialScale); - Offset get _viewportCenter => viewportSize.center(Offset.zero); + Offset get viewportCenter => viewportSize.center(Offset.zero); Offset get _contentCenter => contentSize.center(Offset.zero); - Offset viewportToStatePosition(AvesMagnifierController controller, Offset viewportPosition) { - return viewportPosition - _viewportCenter - controller.position; - } - Offset viewportToContentPosition(AvesMagnifierController controller, Offset viewportPosition) { - return viewportToStatePosition(controller, viewportPosition) / controller.scale! + _contentCenter; + return (viewportPosition - viewportCenter - controller.position) / controller.scale! + _contentCenter; } Offset contentToStatePosition(double scale, Offset contentPosition) {