aves/lib/widgets/common/magnifier/pan/scroll_physics.dart
2022-05-12 17:32:51 +09:00

34 lines
1.3 KiB
Dart

import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
// `PageView` contains a `Scrollable` which sets up a `HorizontalDragGestureRecognizer`.
// This recognizer will win in the gesture arena when the drag distance reaches
// `kTouchSlop` (or platform settings, cf gestures/events.dart `computeHitSlop`).
// We cannot change that, but we can prevent the scrollable from panning until this threshold is reached
// and let other recognizers accept the gesture instead.
class MagnifierScrollerPhysics extends ScrollPhysics {
final DeviceGestureSettings? gestureSettings;
// in [0, 1]
// 0: most reactive but will not let Magnifier recognizers accept gestures
// 1: less reactive but gives the most leeway to Magnifier recognizers
final double touchSlopFactor;
const MagnifierScrollerPhysics({
required this.gestureSettings,
this.touchSlopFactor = 1,
ScrollPhysics? parent,
}) : super(parent: parent);
@override
MagnifierScrollerPhysics applyTo(ScrollPhysics? ancestor) {
return MagnifierScrollerPhysics(
gestureSettings: gestureSettings,
touchSlopFactor: touchSlopFactor,
parent: buildParent(ancestor),
);
}
@override
double get dragStartDistanceMotionThreshold => (gestureSettings?.touchSlop ?? kTouchSlop) * touchSlopFactor;
}