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

问题描述

我有一个在webview中托管 reactjs 应用程序的C# Xamarin 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 应用程序以编程方式)来改变关于被解释为拖动而不是拖动的敏感度点击

通过IOnTouchListenerAndroid.WebKit.WebView

_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 代码负责将其解释为拖动的内容。

标签: androidreactjsxamarinwebviewtouch

解决方案


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

第二个是考虑到Android所说的“触摸倾斜”:

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

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

谷歌在这里提供了一个在不同上下文中处理它的方法示例:https ://developer.android.com/training/gestures/viewgroup#vc ,您可能会适应您的情况。


推荐阅读