是否可以让基于 android webview 的应用程序在将点击解释为小拖动时不那么敏感?

Is it possible to make android webview based app less sensitive in interpreting taps as small drags?

我有 C# Xamarin android 应用程序在 webview.

中托管一个 reactjs 应用程序

在触摸屏 android 设备上使用此应用程序时,似乎偶尔点击屏幕会被忽略。

似乎正在发生的事情是,点击被解释为一个微型拖动事件,因为点击中有一些小的方向移动。

查看 android 日志,对于失败的点击,我注意到如下输出:

adb -d logcat -s CustomFrequencyManagerService

06-19 13:35:49.225  2945  9989 D CustomFrequencyManagerService: acquireDVFSLockLocked : type : DVFS_MIN_LIMIT  frequency : 839000  uid : 1000  pid : 2945  pkgName : GESTURE_DETECTED@CPU_MIN@49
06-19 13:35:49.781  2945  2945 D CustomFrequencyManagerService: releaseDVFSLockLocked : Getting Lock type frm List : DVFS_MIN_LIMIT  frequency : 839000  uid : 1000  pid : 2945  tag : GESTURE_DETECTED@CPU_MIN@49

注意日志条目的 GESTURE_DETECTED 部分。

但是对于成功的点击,CustomFrequencyManagerService 在日志中没有输出。

reactjs 应用程序的角度来看:

我注意到失败的点击会发出以下事件:

touchstart
touchend

而正常的成功事件是:

touchstart
touchend
mousedown
blur
mouseup
click

我可能会更改 reactjs 应用程序以直接响应触摸事件而不是单击事件,但我想知道是否有办法(希望以编程方式通过 android app) 改变关于拖动而不是点击的敏感度?

通过在 Android.WebKit.WebView

上安装 IOnTouchListener
_webView.SetOnTouchListener(new GestureIgnoreTouchListener());

我能够看到点击变成拖动的移动阈值。

    public class GestureIgnoreTouchListener : Java.Lang.Object, Android.Views.View.IOnTouchListener
    {
        float _x;
        float _y;

        public bool OnTouch(Android.Views.View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down)
            {
                _x = e.RawX;
                _y = e.RawY;
                
                return false;
            }
            if (e.Action == MotionEventActions.Up)
            {
                var diffX = e.RawX - _x;
                var diffY = e.RawY - _y;

                var distance = Math.Sqrt(Math.Pow(diffX, 2) + Math.Pow(diffY, 2));
                // observed: 
                // if distance is 10 or less then this is interpreted as a click.
                // if distance is 12 or greater, click is not emitted.
                Console.WriteLine(distance);

                return false;
            }

            return false;
        }
    }

理想情况下,如果距离在 10 到 50 之间,我希望能够将其视为单击而不是拖动。在这种情况下,我可能可以创建一个合成点击事件,但我希望我能以某种方式影响 android 负责将其解释为拖动的代码。

我见过人们使用两种方法来处理这种情况。您已经提到的第一个:在触摸屏环境中告诉 React 使用点击事件而不是点击事件。

第二个是考虑到 Android 所说的“touch slop”:

来自https://developer.android.com/training/gestures/movement.html

Because finger-based touch isn't always the most precise form of interaction, detecting touch events is often based more on movement than on simple contact. To help apps distinguish between movement-based gestures (such as a swipe) and non-movement gestures (such as a single tap), Android includes the notion of "touch slop". Touch slop refers to the distance in pixels a user's touch can wander before the gesture is interpreted as a movement-based gesture. For more discussion of this topic, see Managing Touch Events in a ViewGroup.

Google 提供了一个在不同上下文中处理它的方法示例:https://developer.android.com/training/gestures/viewgroup#vc 您可能会根据自己的情况进行调整。