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

Tom*_*Tom 7 android touch webview xamarin reactjs

我有一个 C# Xamarin android应用程序,它在webview中托管了一个 reactjs 应用程序。

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

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

查看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
Run Code Online (Sandbox Code Playgroud)

请注意GESTURE_DETECTED日志条目的部分。

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

reactjs应用程序的角度来看:

我注意到失败的水龙头会发出以下事件:

touchstart
touchend
Run Code Online (Sandbox Code Playgroud)

而正常的成功事件是:

touchstart
touchend
mousedown
blur
mouseup
click
Run Code Online (Sandbox Code Playgroud)

我可能会更改 reactjs 应用程序以直接响应触摸事件而不是单击事件,但我想知道是否有一种方法(希望通过 android 应用程序编程方式来改变解释为拖动而不是点击

通过IOnTouchListenerAndroid.WebKit.WebView

_webView.SetOnTouchListener(new GestureIgnoreTouchListener());
Run Code Online (Sandbox Code Playgroud)

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

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

lfa*_*lin 1

我见过人们针对这种情况使用两种方法。您已经提到的第一个:当您在触摸屏环境中时告诉反应使用点击事件而不是单击事件。

第二个是考虑 Android 所说的“触摸溢出”:

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

由于基于手指的触摸并不总是最精确的交互形式,因此检测触摸事件通常更多地基于移动而不是简单的接触。为了帮助应用程序区分基于移动的手势(例如滑动)和非移动手势(例如单击),Android 引入了“触摸倾斜”的概念。触摸倾斜是指在手势被解释为基于移动的手势之前用户触摸可以漂移的距离(以像素为单位)。有关此主题的更多讨论,请参阅管理 ViewGroup 中的触摸事件。

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