viewer: fixed flickering on first scale animation in some cases

This commit is contained in:
Thibault Deckers 2023-03-19 10:49:34 +01:00
parent b15f5832d9
commit 96005031c7
4 changed files with 18 additions and 14 deletions

View file

@ -4,11 +4,12 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased] ## <a id="unreleased"></a>[Unreleased]
## <a id="v1.8.4"></a>[v1.8.4] - 2023-03-17
### Fixed ### Fixed
- permission confusion when removable volume changes - permission confusion when removable volume changes
- Viewer: flickering on first scale animation in some cases
## <a id="v1.8.4"></a>[v1.8.4] - 2023-03-17
### Added ### Added

View file

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui';
import 'package:aves_magnifier/src/controller/state.dart'; import 'package:aves_magnifier/src/controller/state.dart';
import 'package:aves_magnifier/src/scale/scale_boundaries.dart'; import 'package:aves_magnifier/src/scale/scale_boundaries.dart';
@ -20,17 +19,13 @@ class AvesMagnifierController {
AvesMagnifierController({ AvesMagnifierController({
MagnifierState? initialState, MagnifierState? initialState,
}) : super() { }) : super() {
initial = initialState ?? const source = ChangeSource.internal;
const MagnifierState( initial = initialState ?? const MagnifierState(position: Offset.zero, scale: null, source: source);
position: Offset.zero,
scale: null,
source: ChangeSource.internal,
);
previousState = initial; previousState = initial;
_currentState = initial; _currentState = initial;
_setState(initial); _setState(initial);
const _initialScaleState = ScaleStateChange(state: ScaleState.initial, source: ChangeSource.internal); const _initialScaleState = ScaleStateChange(state: ScaleState.initial, source: source);
previousScaleState = _initialScaleState; previousScaleState = _initialScaleState;
_currentScaleState = _initialScaleState; _currentScaleState = _initialScaleState;
_setScaleState(_initialScaleState); _setScaleState(_initialScaleState);

View file

@ -80,15 +80,20 @@ mixin AvesMagnifierControllerDelegate on State<MagnifierCore> {
Offset get position => controller.position; Offset get position => controller.position;
double? recalcScale() {
final scaleState = controller.scaleState.state;
final newScale = controller.getScaleForScaleState(scaleState);
markNeedsScaleRecalc = false;
setScale(newScale, ChangeSource.internal);
return newScale;
}
double? get scale { double? get scale {
final scaleState = controller.scaleState.state; final scaleState = controller.scaleState.state;
final needsRecalc = markNeedsScaleRecalc && !(scaleState == ScaleState.zoomedIn || scaleState == ScaleState.zoomedOut); final needsRecalc = markNeedsScaleRecalc && !(scaleState == ScaleState.zoomedIn || scaleState == ScaleState.zoomedOut);
final scaleExistsOnController = controller.scale != null; final scaleExistsOnController = controller.scale != null;
if (needsRecalc || !scaleExistsOnController) { if (needsRecalc || !scaleExistsOnController) {
final newScale = controller.getScaleForScaleState(scaleState); return recalcScale();
markNeedsScaleRecalc = false;
setScale(newScale, ChangeSource.internal);
return newScale;
} }
return controller.scale; return controller.scale;
} }

View file

@ -72,6 +72,9 @@ class _MagnifierCoreState extends State<MagnifierCore> with TickerProviderStateM
..addStatusListener(onAnimationStatus); ..addStatusListener(onAnimationStatus);
_positionAnimationController = AnimationController(vsync: this)..addListener(handlePositionAnimate); _positionAnimationController = AnimationController(vsync: this)..addListener(handlePositionAnimate);
_registerWidget(widget); _registerWidget(widget);
// force delegate scale computing on initialization
// so that it does not happen lazily at the beginning of a scale animation
recalcScale();
} }
@override @override