2

我有一个自定义视图,我想检测用户何时按下/触摸同一点超过 2 秒。我一直在使用一个onTouch事件来检测用户何时首次触摸屏幕,然后在 2 秒后查看他是否仍在触摸同一个位置。但是,我如何检测用户何时将手指移动到不同的位置(与 期间的位置不同ACTION_DOWN)并在那里保持超过 2 秒。我的 onTouch 事件代码如下。我尝试实现相同的逻辑,ACTION_MOVE但它没有正常工作。如果用户触摸屏幕,将手指移动到某个位置然后保持静止超过 2 秒,我如何检测到它?

有没有其他方法或类可以帮助我实现同样的目标?

@Override
public boolean onTouchEvent(final MotionEvent event) {
    // MotionEvent object holds X-Y values
    super.onTouchEvent(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            Log.d("Action", "Move");
            mViewIsPressed = true;
            touchY = event.getY();
            break;

        case MotionEvent.ACTION_DOWN:
            Log.d("Action", "Down");
            String text = "You click at x = " + event.getX() + " and y = " + event.getY();
                Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
                yCoordPrev = event.getRawY();
            runnable = new Runnable() {
                public void run() {
                    //Check if user is still holding down on the view
                    if (mViewIsPressed) {
                        yCoordCurr = event.getRawY();
                        //Check if position that is being held down is the same (or within range) as 2 seconds ago
                        Log.d("YPrev: ",String.valueOf(yCoordPrev));
                        Log.d("YCurr: ",String.valueOf(yCoordCurr));
                        if ((yCoordCurr < yCoordPrev + 10) && (yCoordCurr > yCoordPrev - 10)) {
                            //Do what you want here after 2 seconds of pressing
                            Log.d("Fire: ", "fire");
                        }
                    }
                }
            };

            handler.postDelayed(runnable, 2000);
            mViewIsPressed = true;
            break;

        case MotionEvent.ACTION_UP:
            Log.d("Action", "Up");
            if (mViewIsPressed) {
                mViewIsPressed = false;
                yCoordCurr = event.getY();
                //Cancel the runnable because the user stopped pressing
                handler.removeCallbacks(runnable);
            }
            break;
    }
    invalidate();
    return true;
}
4

0 回答 0