mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-20 11:08:03 +08:00
70 lines
1.9 KiB
Dart
70 lines
1.9 KiB
Dart
import 'package:PiliPlus/utils/storage_pref.dart';
|
|
import 'package:flutter/gestures.dart';
|
|
|
|
mixin InitialPositionMixin on GestureRecognizer {
|
|
Offset? _initialPosition;
|
|
Offset? get initialPosition => _initialPosition;
|
|
|
|
@override
|
|
void addAllowedPointer(PointerDownEvent event) {
|
|
super.addAllowedPointer(event);
|
|
_initialPosition = event.position;
|
|
}
|
|
}
|
|
|
|
class CustomHorizontalDragGestureRecognizer
|
|
extends HorizontalDragGestureRecognizer
|
|
with InitialPositionMixin {
|
|
CustomHorizontalDragGestureRecognizer({
|
|
super.debugOwner,
|
|
super.supportedDevices,
|
|
super.allowedButtonsFilter,
|
|
});
|
|
|
|
@override
|
|
DeviceGestureSettings get gestureSettings => _gestureSettings;
|
|
final _gestureSettings = DeviceGestureSettings(touchSlop: touchSlopH);
|
|
|
|
@override
|
|
bool hasSufficientGlobalDistanceToAccept(
|
|
PointerDeviceKind pointerDeviceKind,
|
|
double? deviceTouchSlop,
|
|
) {
|
|
return _computeHitSlop(
|
|
globalDistanceMoved.abs(),
|
|
gestureSettings,
|
|
pointerDeviceKind,
|
|
_initialPosition,
|
|
lastPosition.global,
|
|
);
|
|
}
|
|
}
|
|
|
|
double touchSlopH = Pref.touchSlopH;
|
|
|
|
bool _computeHitSlop(
|
|
double globalDistanceMoved,
|
|
DeviceGestureSettings settings,
|
|
PointerDeviceKind kind,
|
|
Offset? initialPosition,
|
|
Offset lastPosition,
|
|
) {
|
|
switch (kind) {
|
|
case PointerDeviceKind.mouse:
|
|
return globalDistanceMoved > kPrecisePointerHitSlop;
|
|
case PointerDeviceKind.stylus:
|
|
case PointerDeviceKind.invertedStylus:
|
|
case PointerDeviceKind.unknown:
|
|
case PointerDeviceKind.touch:
|
|
return globalDistanceMoved > settings.touchSlop! &&
|
|
_calc(initialPosition!, lastPosition);
|
|
case PointerDeviceKind.trackpad:
|
|
return globalDistanceMoved > settings.touchSlop!;
|
|
}
|
|
}
|
|
|
|
bool _calc(Offset initialPosition, Offset lastPosition) {
|
|
final offset = lastPosition - initialPosition;
|
|
return offset.dx.abs() > offset.dy.abs() * 3;
|
|
}
|