我有和C# Xamarinandroid应用程序,它在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 代码。
我看到人们在这种情况下使用两种方法。你已经提到的第一个:当你在触摸屏环境中时告诉反应使用点击事件而不是点击事件。
第二个是考虑到Android所说的">触摸倾斜":
从 https://developer.android.com/training/gestures/movement.html:
因为基于手指的触摸并不总是最精确的形式 交互,检测触摸事件通常更多地基于运动 比简单的接触。帮助应用区分 基于移动的手势(如轻扫(和非移动手势 (例如单击(,Android包含"触摸倾斜"的概念。 触摸斜率是指用户的触摸可以漂移的距离(以像素为单位( 在将手势解释为基于移动的手势之前。为 有关此主题的更多讨论,请参阅在 视图组。
Google在这里提供了一个在不同上下文中处理它的一种方法的示例:https://developer.android.com/training/gestures/viewgroup#vc 您可能会适应自己的情况。