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

Posted

技术标签:

【中文标题】是否有可能使基于 android webview 的应用程序在将点击解释为小拖动时不那么敏感?【英文标题】:Is it possible to make android webview based app less sensitive in interpreting taps as small drags? 【发布时间】:2020-10-17 06:59:27 【问题描述】:

我有一个 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

注意日志条目的GESTURE_DETECTED 部分。

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

reactjs 应用的角度来看:

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

touchstart
touchend

虽然正常的成功事件是:

touchstart
touchend
mousedown
blur
mouseup
click

我可能会更改 reactjs 应用程序以直接响应触摸事件而不是点击事件,但我想知道 是否有办法(希望通过 android 应用程序以编程方式)改变对什么被解释为拖动而不是点击的敏感性

通过在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 代码负责将其解释为拖动。

【问题讨论】:

您可以设置OnDragListener并检查它是否不是拖动,将事件传递给OnClickListener (感谢您的建议)只有 TouchListener 似乎可以与 webview 一起使用。 Drag + Click 似乎从未被调用过。 (我看到其他 SO 帖子也有同样的想法 - ***.com/questions/3600017/…) 您是否尝试过创建拖动/滑动手势识别器并分配阈值?这可能会使小于指定值的任何内容都被解释为轻敲。希望???? 【参考方案1】:

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

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

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

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

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

【讨论】:

谢谢——至少现在我知道这个概念叫什么了。

以上是关于是否有可能使基于 android webview 的应用程序在将点击解释为小拖动时不那么敏感?的主要内容,如果未能解决你的问题,请参考以下文章

Android:使锚链接在 ScrollView 内的 WebView 中工作

Android WebView 可滚动

Android Cordova:使 WebView HTML 元素透明以查看原生元素

Android WebView 在开发过程中都有哪些坑

使文件输入字段在Android nativescript vue webview上工作

Cordova InAppBrowser 和与 webview 共享的 cookie