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="v1.8.4"></a>[v1.8.4] - 2023-03-17
### Fixed
- 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

View file

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

View file

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

View file

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