如何在Android上检测长时间触摸(超过2秒)

如何在Android上检测长时间触摸(超过2秒),android,touch,android-custom-view,ontouch,touch-location,Android,Touch,Android Custom View,Ontouch,Touch Location,我有一个自定义视图,我想检测用户何时按下/触摸同一点超过2秒。我一直在使用一个onTouch事件来检测用户何时第一次触摸屏幕,然后查看2秒钟后他是否仍在触摸同一个点。但是,我如何检测用户何时将手指移动到不同的位置(与操作_DOWN期间的位置不同)并在那里保持2秒钟以上。我的onTouch事件代码如下。我试着在ACTION\u MOVE上实现相同的逻辑,但它没有正常工作。如果用户触摸屏幕,将手指移动到某个点,然后使其静止超过2秒,我如何检测它 有没有其他方法或类可以帮助我实现同样的目标 @Over

我有一个自定义视图,我想检测用户何时按下/触摸同一点超过2秒。我一直在使用一个
onTouch
事件来检测用户何时第一次触摸屏幕,然后查看2秒钟后他是否仍在触摸同一个点。但是,我如何检测用户何时将手指移动到不同的位置(与
操作_DOWN
期间的位置不同)并在那里保持2秒钟以上。我的onTouch事件代码如下。我试着在
ACTION\u 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;
}
@覆盖
公共布尔onTouchEvent(最终运动事件){
//MotionEvent对象保存X-Y值
超级事件(事件);
开关(event.getAction()){
case MotionEvent.ACTION\u移动:
日志d(“行动”、“移动”);
mViewIsPressed=true;
touchY=event.getY();
打破
case MotionEvent.ACTION\u DOWN:
日志d(“动作”、“下降”);
String text=“单击x=“+event.getX()+”和y=“+event.getY()”;
Toast.makeText(getContext(),text,Toast.LENGTH_LONG).show();
yCoordPrev=event.getRawY();
runnable=新的runnable(){
公开募捐{
//检查用户是否仍按住视图
如果(mViewIsPressed){
yCoordCurr=event.getRawY();
//检查被按住的位置是否与2秒前相同(或在范围内)
Log.d(“YPrev:,String.valueOf(yCoordPrev));
Log.d(“YCurr:,String.valueOf(yCoordCurr));
如果((yCoordCurryCoordPrev-10)){
//按下2秒钟后,在此处执行所需操作
日志d(“火灾:”,“火灾”);
}
}
}
};
handler.postDelayed(runnable,2000);
mViewIsPressed=true;
打破
case MotionEvent.ACTION\u UP:
日志d(“行动”、“向上”);
如果(mViewIsPressed){
mViewIsPressed=false;
yCoordCurr=event.getY();
//取消runnable,因为用户已停止按
handler.removeCallbacks(可运行);
}
打破
}
使无效();
返回true;
}