LongClick事件发生得太快了.如何增加触发它所需的点击时间?

amp*_*dre 17 android event-handling

在我正在处理的应用程序中,我要求用户必须在特定操作发生之前单击并按住组件一段时间.

我目前正在使用OnLongClickListener来监听longclick,但我发现触发OnLongClick事件的单击长度太短.

例如,假设LongClick事件在400ms单击后触发,但我希望用户必须在事件触发前单击并保持1200ms.

有没有什么办法可以配置LongClick事件需要更长的点击?
或者是否有另一种结构可以让我倾听更长的点击次数?

Roh*_*han 20

无法在onLongClick事件上更改计时器,它由android本身管理.

可能的是使用.setOnTouchListener().

然后在MotionEvent是ACTION_DOWN时注册.
注意变量中的当前时间.
然后当注册带有ACTION_UP的MotionEvent并且current_time - actionDown时间> 1200 ms然后执行某些操作.

非常好:

Button button = new Button();
long then = 0;
    button.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                then = (Long) System.currentTimeMillis();
            }
            else if(event.getAction() == MotionEvent.ACTION_UP){
                if(((Long) System.currentTimeMillis() - then) > 1200){
                    return true;
                }
            }
            return false;
        }
    })
Run Code Online (Sandbox Code Playgroud)

  • 这几乎可以满足我的需要。仅当用户抬起手指时,发布的方法才执行代码。我希望我的业务逻辑在延迟结束后立即运行,而不是在用户停止按时运行。 (2认同)

mpk*_*uth 5

这是我发现实现此行为的最简单方法。与当前接受的答案相比,它有几个优点。

  1. 通过检查,view.isPressed我们确保在触摸事件离开视图时不会触发onClickonLongClick。这模仿了系统的默认onClickonLongClick行为。
  2. 该事件已经存储了计时信息,因此无需自己存储开始时间ACTION_DOWN或计算当前时间ACTION_UP。这意味着我们可以同时将它用于多个视图,因为我们没有在onTouch.

注意:ViewConfiguration.getLongPressTimeout()是默认值,您可以更改该检查以使用您想要的任何值。

注意:如果视图通常不会点击你需要调用view.setClickable(true)view.isPressed()检查工作。

@Override
public boolean onTouch(View view, MotionEvent event) {
    if (view.isPressed() && event.getAction() == MotionEvent.ACTION_UP) {
        long eventDuration = event.getEventTime() - event.getDownTime();
        if (eventDuration > ViewConfiguration.getLongPressTimeout()) {
            onLongClick(view);
        } else {
            onClick(view);
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果您像@ampersandre 一样,希望在达到延迟期后立即触发长按事件而不是等待,ACTION_UP那么以下对我来说效果很好。

@Override
public boolean onTouch(View view, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        view.setTag(true);
    } else if (view.isPressed() && (boolean) view.getTag()) {
        long eventDuration = event.getEventTime() - event.getDownTime();
        if (eventDuration > ViewConfiguration.getLongPressTimeout()) {
            view.setTag(false);
            onLongClick(view);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            onClick(view);
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)