diff --git a/lib/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart b/lib/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart index e453f8bcf..fe7c2da03 100644 --- a/lib/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart +++ b/lib/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:flutter/foundation.dart' show PlatformDispatcher; import 'package:flutter/gestures.dart'; mixin InitialPositionMixin on GestureRecognizer { @@ -50,20 +51,30 @@ bool _computeHitSlop( Offset lastPosition, ) { switch (kind) { - case PointerDeviceKind.mouse: + case .mouse: return globalDistanceMoved > kPrecisePointerHitSlop; - case PointerDeviceKind.stylus: - case PointerDeviceKind.invertedStylus: - case PointerDeviceKind.unknown: - case PointerDeviceKind.touch: + case .stylus: + case .invertedStylus: + case .unknown: + case .touch: return globalDistanceMoved > settings.touchSlop! && - _calc(initialPosition!, lastPosition); - case PointerDeviceKind.trackpad: + _calcAngle(initialPosition!, lastPosition); + case .trackpad: return globalDistanceMoved > settings.touchSlop!; } } -bool _calc(Offset initialPosition, Offset lastPosition) { +bool _calcAngle(Offset initialPosition, Offset lastPosition) { final offset = lastPosition - initialPosition; return offset.dx.abs() > offset.dy.abs() * 3; } + +final deviceTouchSlop = _calcDeviceTouchSlop(); + +double _calcDeviceTouchSlop() { + final view = PlatformDispatcher.instance.views.first; + final physicalTouchSlop = view.gestureSettings.physicalTouchSlop; + return physicalTouchSlop == null + ? kTouchSlop + : physicalTouchSlop / view.devicePixelRatio; +} diff --git a/lib/pages/setting/models/extra_settings.dart b/lib/pages/setting/models/extra_settings.dart index b8a2e263b..a1806be97 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -4,7 +4,7 @@ import 'dart:math' show max; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart' - show touchSlopH; + show deviceTouchSlop, touchSlopH; import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart' show ImageGridView, ImageModel; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; @@ -236,7 +236,7 @@ List get extraSettings => [ ), NormalModel( title: '横向滑动阈值', - getSubtitle: () => '当前:「${Pref.touchSlopH}」', + getSubtitle: () => '当前:「${Pref.touchSlopH}」,系统默认值: $deviceTouchSlop', onTap: _showTouchSlopDialog, leading: const Icon(Icons.pan_tool_alt_outlined), ), diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index b3d44be75..64f3eba6d 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -1,6 +1,8 @@ import 'dart:io'; import 'dart:math' show pow, sqrt; +import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart' + show deviceTouchSlop; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/models/common/bar_hide_type.dart'; @@ -967,8 +969,10 @@ abstract final class Pref { static bool get showDynDispute => _setting.get(SettingBoxKey.showDynDispute, defaultValue: false); - static double get touchSlopH => - _setting.get(SettingBoxKey.touchSlopH, defaultValue: 24.0); + static double get touchSlopH => _setting.get( + SettingBoxKey.touchSlopH, + defaultValue: deviceTouchSlop + 6.0, + ); static bool get saveReply => _setting.get(SettingBoxKey.saveReply, defaultValue: true);