是否有可能使基于 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 Cordova:使 WebView HTML 元素透明以查看原生元素