improve horizontal touch slop

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-05-15 10:22:29 +08:00
parent 2c511d1a2c
commit ce706d4732
3 changed files with 27 additions and 12 deletions

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:flutter/foundation.dart' show PlatformDispatcher;
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
mixin InitialPositionMixin on GestureRecognizer { mixin InitialPositionMixin on GestureRecognizer {
@@ -50,20 +51,30 @@ bool _computeHitSlop(
Offset lastPosition, Offset lastPosition,
) { ) {
switch (kind) { switch (kind) {
case PointerDeviceKind.mouse: case .mouse:
return globalDistanceMoved > kPrecisePointerHitSlop; return globalDistanceMoved > kPrecisePointerHitSlop;
case PointerDeviceKind.stylus: case .stylus:
case PointerDeviceKind.invertedStylus: case .invertedStylus:
case PointerDeviceKind.unknown: case .unknown:
case PointerDeviceKind.touch: case .touch:
return globalDistanceMoved > settings.touchSlop! && return globalDistanceMoved > settings.touchSlop! &&
_calc(initialPosition!, lastPosition); _calcAngle(initialPosition!, lastPosition);
case PointerDeviceKind.trackpad: case .trackpad:
return globalDistanceMoved > settings.touchSlop!; return globalDistanceMoved > settings.touchSlop!;
} }
} }
bool _calc(Offset initialPosition, Offset lastPosition) { bool _calcAngle(Offset initialPosition, Offset lastPosition) {
final offset = lastPosition - initialPosition; final offset = lastPosition - initialPosition;
return offset.dx.abs() > offset.dy.abs() * 3; 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;
}

View File

@@ -4,7 +4,7 @@ import 'dart:math' show max;
import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.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' import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart'
show ImageGridView, ImageModel; show ImageGridView, ImageModel;
import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
@@ -236,7 +236,7 @@ List<SettingsModel> get extraSettings => [
), ),
NormalModel( NormalModel(
title: '横向滑动阈值', title: '横向滑动阈值',
getSubtitle: () => '当前:「${Pref.touchSlopH}', getSubtitle: () => '当前:「${Pref.touchSlopH},系统默认值: $deviceTouchSlop',
onTap: _showTouchSlopDialog, onTap: _showTouchSlopDialog,
leading: const Icon(Icons.pan_tool_alt_outlined), leading: const Icon(Icons.pan_tool_alt_outlined),
), ),

View File

@@ -1,6 +1,8 @@
import 'dart:io'; import 'dart:io';
import 'dart:math' show pow, sqrt; 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/common/widgets/pair.dart';
import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/models/common/bar_hide_type.dart'; import 'package:PiliPlus/models/common/bar_hide_type.dart';
@@ -967,8 +969,10 @@ abstract final class Pref {
static bool get showDynDispute => static bool get showDynDispute =>
_setting.get(SettingBoxKey.showDynDispute, defaultValue: false); _setting.get(SettingBoxKey.showDynDispute, defaultValue: false);
static double get touchSlopH => static double get touchSlopH => _setting.get(
_setting.get(SettingBoxKey.touchSlopH, defaultValue: 24.0); SettingBoxKey.touchSlopH,
defaultValue: deviceTouchSlop + 6.0,
);
static bool get saveReply => static bool get saveReply =>
_setting.get(SettingBoxKey.saveReply, defaultValue: true); _setting.get(SettingBoxKey.saveReply, defaultValue: true);