使用Android检测长按

Jac*_*ack 70 java android touchscreen long-click

我目前正在使用

onTouchEvent(MotionEvent event){
}
Run Code Online (Sandbox Code Playgroud)

检测用户何时按下我的glSurfaceView是否有办法检测何时进行长按.我猜我是否在开发文档中找不到多少,那么它将是某种方法的工作.类似于注册ACTION_DOWN并查看ACTION_UP之前的时间.

你如何使用opengl-es检测android上的长按?

MSq*_*are 149

GestureDetector是最好的解决方案.

这是一个有趣的选择.在每个ACTION_DOWN的onTouchEvent上安排Runnable在1秒内运行.在每个ACTION_UPACTION_MOVE上,取消已调度的Runnable.如果从ACTION_DOWN事件中取消的次数少于1 ,则Runnable将不会运行.

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
        Log.i("", "Long press!");
    }   
};

@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView){
    if(event.getAction() == MotionEvent.ACTION_DOWN)
        handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout());
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() == MotionEvent.ACTION_UP))
        handler.removeCallbacks(mLongPressed);
    return super.onTouchEvent(event, mapView);
}
Run Code Online (Sandbox Code Playgroud)

  • 通过调用`android.view.ViewConfiguration.getLongPressTimeout()`可以获得长按的系统超时. (16认同)
  • 我不知道为什么,但这两种解决方案都不适合我。 (2认同)
  • ACTION_CANCEL也应处理 (2认同)
  • 谢谢@MSquare。这是一个好主意。请注意,对于我正在使用的设备,我只能响应A​​CTION_UP才能删除回调;这是因为它对运动非常敏感,并且我无法阻止ACTION_MOVE事件。还要注意,您的方法通过递归调用Runnable提供了一种执行重复操作的自然方法。 (2认同)

Dan*_*ete 104

试试这个:

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
    public void onLongPress(MotionEvent e) {
        Log.e("", "Longpress detected");
    }
});

public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
};
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果您已经有一个OnClickListener,那么添加OnLongClickListener比使用GestureRecognizer要容易得多(有一些特定于GR的问题,您可以避免).cf http://stackoverflow.com/a/4402854/153422 (21认同)
  • 请注意,您应该提供有关创建GestureDetector作为第一个参数的上下文.该示例已弃用. (9认同)

San*_*Ved 5

我有一个代码,可以检测到点击,长按和移动.它完全是上面给出的答案和我偷窥每个文档页面所做的更改的组合.

//Declare this flag globally
boolean goneFlag = false;

//Put this into the class
final Handler handler = new Handler(); 
    Runnable mLongPressed = new Runnable() { 
        public void run() { 
            goneFlag = true;
            //Code for long click
        }   
    };

//onTouch code
@Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {    
        case MotionEvent.ACTION_DOWN:
            handler.postDelayed(mLongPressed, 1000);
            //This is where my code for movement is initialized to get original location.
            break;
        case MotionEvent.ACTION_UP:
            handler.removeCallbacks(mLongPressed);
            if(Math.abs(event.getRawX() - initialTouchX) <= 2 && !goneFlag) {
                //Code for single click
                return false;
            }
            break;
        case MotionEvent.ACTION_MOVE:
            handler.removeCallbacks(mLongPressed);
            //Code for movement here. This may include using a window manager to update the view
            break;
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

我确认它正在工作,因为我在我自己的应用程序中使用它.