viewer: fixed flickering on first scale animation in some cases
This commit is contained in:
parent
b15f5832d9
commit
96005031c7
4 changed files with 18 additions and 14 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue