检测Sloppy Clicks Android

时间:2016-03-12 01:01:35

标签: java android ontouchlistener

我有一个ImageView,我需要区分点击和longclick以及滑动。为此,我使用以下代码:

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条件以允许这些凌乱的点击但同时时间没有将偏移设置为高,因此滑动不会被误认为是点击。

1 个答案:

答案 0 :(得分:1)

定义允许的'邋''半径,这将有效地创建一个带有初始点击中心坐标的圆。然后验证释放坐标是否在该圈内。

要验证释放坐标是否在该圆内,您需要计算圆心和点之间的距离,并验证它是否小于半径。 (参见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 
}