#937 viewer: fixed position drift during scale
This commit is contained in:
parent
bd9a89e5d4
commit
5db31476fe
3 changed files with 9 additions and 8 deletions
|
@ -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
|
||||
|
||||
## <a id="v1.10.7"></a>[v1.10.7] - 2024-03-12
|
||||
|
||||
|
|
|
@ -220,12 +220,16 @@ class _AvesMagnifierState extends State<AvesMagnifier> 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,
|
||||
);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue