From 3c6d4ef08ce3c530fa35adf0e0dbcb30c2c4c2b0 Mon Sep 17 00:00:00 2001 From: dom Date: Fri, 15 May 2026 10:22:29 +0800 Subject: [PATCH] improve horizontal touch slop Signed-off-by: dom --- .../horizontal_drag_gesture_recognizer.dart | 27 +++++++++++++------ lib/pages/setting/models/extra_settings.dart | 4 +-- lib/utils/storage_pref.dart | 8 ++++-- 3 files changed, 27 insertions(+), 12 deletions(-) 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 264244167..1ded91806 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -3,7 +3,7 @@ import 'dart:io'; 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; import 'package:PiliPlus/http/fav.dart'; @@ -94,7 +94,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 14b7ad2ca..dd8a73149 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/dynamic/dynamic_badge_mode.dart'; @@ -509,8 +511,10 @@ abstract final class Pref { static bool get enableImgMenu => _setting.get(SettingBoxKey.enableImgMenu, 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 floatingNavBar => _setting.get(SettingBoxKey.floatingNavBar, defaultValue: false);