是否可以让基于 android webview 的应用程序在将点击解释为小拖动时不那么敏感?
Is it possible to make android webview based app less sensitive in interpreting taps as small drags?
我有 C# Xamarin android 应用程序在 webview.
中托管一个 reactjs 应用程序
在触摸屏 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 app) 改变关于拖动而不是点击的敏感度?
通过在 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 负责将其解释为拖动的代码。
我见过人们使用两种方法来处理这种情况。您已经提到的第一个:在触摸屏环境中告诉 React 使用点击事件而不是点击事件。
第二个是考虑到 Android 所说的“touch slop”:
来自https://developer.android.com/training/gestures/movement.html:
Because finger-based touch isn't always the most precise form of
interaction, detecting touch events is often based more on movement
than on simple contact. To help apps distinguish between
movement-based gestures (such as a swipe) and non-movement gestures
(such as a single tap), Android includes the notion of "touch slop".
Touch slop refers to the distance in pixels a user's touch can wander
before the gesture is interpreted as a movement-based gesture. For
more discussion of this topic, see Managing Touch Events in a
ViewGroup.
Google 提供了一个在不同上下文中处理它的方法示例:https://developer.android.com/training/gestures/viewgroup#vc 您可能会根据自己的情况进行调整。
我有 C# Xamarin android 应用程序在 webview.
中托管一个 reactjs 应用程序在触摸屏 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 app) 改变关于拖动而不是点击的敏感度?
通过在 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 负责将其解释为拖动的代码。
我见过人们使用两种方法来处理这种情况。您已经提到的第一个:在触摸屏环境中告诉 React 使用点击事件而不是点击事件。
第二个是考虑到 Android 所说的“touch slop”:
来自https://developer.android.com/training/gestures/movement.html:
Because finger-based touch isn't always the most precise form of interaction, detecting touch events is often based more on movement than on simple contact. To help apps distinguish between movement-based gestures (such as a swipe) and non-movement gestures (such as a single tap), Android includes the notion of "touch slop". Touch slop refers to the distance in pixels a user's touch can wander before the gesture is interpreted as a movement-based gesture. For more discussion of this topic, see Managing Touch Events in a ViewGroup.
Google 提供了一个在不同上下文中处理它的方法示例:https://developer.android.com/training/gestures/viewgroup#vc 您可能会根据自己的情况进行调整。