检测草率点击 Android
Detecting Sloppy Clicks Android
我有一个 ImageView,我需要在其中区分单击和长按以及滑动。为此,我使用以下代码:
public boolean onTouch(View v, MotionEvent event) {
Log.d(getClass().getName(), "touch event: " + event.toString());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
y1 = event.getY();
t1 = System.currentTimeMillis();
return true;
case MotionEvent.ACTION_UP:
x2 = event.getX();
y2 = event.getY();
t2 = System.currentTimeMillis();
if (x1 == x2 && y1 == y2 && (t2 - t1) < LONG_PRESS_TIMEOUT) {
//SHORT CLICK
}
如果时间超过 LONG_PRESS_TIMEOUT 则其他 if 条件识别保持,如果触摸和释放的位置明显不同则滑动。无论如何,这是有效的,但是用户需要在完全相同的点按下并放开,这使得它无法识别有点粗糙或草率的触摸,我怎么能改变 if 条件以允许这些混乱的点击但同时时间不要将偏移设置为高,这样滑动就不会被误认为是点击。
定义一个允许 'sloppy' 次点击的半径,这将有效地创建一个以初始点击为中心坐标的圆。然后验证释放坐标是否在该圆圈内。
要验证释放坐标是否在该圆内,您需要计算圆心与点之间的距离并验证它是否小于半径。 (有关所涉及的数学,请参阅 https://math.stackexchange.com/questions/198764/how-to-know-if-a-point-is-inside-a-circle)。
伪代码
bool isWithinCircle(int centerX, int centerY, int x, int y, double radius)
{
var temp = pow(x - centerX, 2) + pow(y - centerY, 2);
return sqrt(temp) < r;
}
那么您的 if 条件将是:
if (isWithinCircle(x1, y1, x2, y2, radius) && (t2 - t1) < LONG_PRESS_TIMEOUT) {
//SHORT CLICK
}
我有一个 ImageView,我需要在其中区分单击和长按以及滑动。为此,我使用以下代码:
public boolean onTouch(View v, MotionEvent event) {
Log.d(getClass().getName(), "touch event: " + event.toString());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
y1 = event.getY();
t1 = System.currentTimeMillis();
return true;
case MotionEvent.ACTION_UP:
x2 = event.getX();
y2 = event.getY();
t2 = System.currentTimeMillis();
if (x1 == x2 && y1 == y2 && (t2 - t1) < LONG_PRESS_TIMEOUT) {
//SHORT CLICK
}
如果时间超过 LONG_PRESS_TIMEOUT 则其他 if 条件识别保持,如果触摸和释放的位置明显不同则滑动。无论如何,这是有效的,但是用户需要在完全相同的点按下并放开,这使得它无法识别有点粗糙或草率的触摸,我怎么能改变 if 条件以允许这些混乱的点击但同时时间不要将偏移设置为高,这样滑动就不会被误认为是点击。
定义一个允许 'sloppy' 次点击的半径,这将有效地创建一个以初始点击为中心坐标的圆。然后验证释放坐标是否在该圆圈内。
要验证释放坐标是否在该圆内,您需要计算圆心与点之间的距离并验证它是否小于半径。 (有关所涉及的数学,请参阅 https://math.stackexchange.com/questions/198764/how-to-know-if-a-point-is-inside-a-circle)。
伪代码
bool isWithinCircle(int centerX, int centerY, int x, int y, double radius)
{
var temp = pow(x - centerX, 2) + pow(y - centerY, 2);
return sqrt(temp) < r;
}
那么您的 if 条件将是:
if (isWithinCircle(x1, y1, x2, y2, radius) && (t2 - t1) < LONG_PRESS_TIMEOUT) {
//SHORT CLICK
}