更改长点击延迟

Posted

技术标签:

【中文标题】更改长点击延迟【英文标题】:Change long click delay 【发布时间】:2012-03-31 18:14:57 【问题描述】:

我正在通过 setOnLongClickListener() 监听视图的长按事件。我可以/持续时间吗?

【问题讨论】:

【参考方案1】:

这是我设置持续时间长按的方式

private int longClickDuration = 3000;
private boolean isLongPress = false;

numEquipeCheat.setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View v, MotionEvent event) 
            if (event.getAction() == MotionEvent.ACTION_DOWN) 
                isLongPress = true;
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() 
                    @Override
                    public void run() 
                        if (isLongPress) 
                            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
                            vibrator.vibrate(100);
                            // set your code here
                            // Don't forgot to add <uses-permission android:name="android.permission.VIBRATE" /> to vibrate.
                        
                    
                , longClickDuration);
             else if (event.getAction() == MotionEvent.ACTION_UP) 
                isLongPress = false;
            
            return true;
        
    );

【讨论】:

【参考方案2】:

AFAIK,不。它通过getLongPressTimeout()ViewConfiguration 在框架中硬连线。

欢迎您处理自己的触摸事件并定义自己的“长按”概念。只需确保它与用户的期望没有太大的不同,并且用户很可能会期望所有其他应用使用什么,即标准的 500 毫秒持续时间。

【讨论】:

您将如何定义自己的长点击概念? 谢谢,我想我现在会坚持使用默认设置。 @zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 可能是通过覆盖视图。酷用户名顺便说一句;-)【参考方案3】:

我在 Kotlin 中定义了一个扩展函数,灵感来自@Galoway 答案:

fun View.setOnVeryLongClickListener(listener: () -> Unit) 
    setOnTouchListener(object : View.OnTouchListener 

        private val longClickDuration = 2000L
        private val handler = Handler()

        override fun onTouch(v: View?, event: MotionEvent?): Boolean 
            if (event?.action == MotionEvent.ACTION_DOWN) 
                handler.postDelayed( listener.invoke() , longClickDuration)
             else if (event?.action == MotionEvent.ACTION_UP) 
                handler.removeCallbacksAndMessages(null)
            
            return true
        
    )

像这样使用它:

button.setOnVeryLongClickListener 
    // Do something here

【讨论】:

完美运行!谢谢! Krasvcheg,horoshee reshenie。 我建议您在 listener.invoke() 之前添加 performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) 以添加与系统长按事件相同的触觉反馈。【参考方案4】:

这是我使用的。它类似于 Cumolo Nimbus 的回答,但有两个显着差异。

    使用已存储的事件值作为停机时间和当前时间。除了不重复工作之外,这还具有使侦听器可同时用于多个视图的良好效果,而无需跟踪每个单独事件的开始时间。 检查view.isPressed 以确保用户在触摸事件期间没有离开视图。这模仿了 onClickonLongClick 的默认系统行为。

long longPressTimeout = 2000;

@Override
public boolean onTouch(View view, MotionEvent event) 
    if (view.isPressed() && event.getAction() == MotionEvent.ACTION_UP) 
        long eventDuration = event.getEventTime() - event.getDownTime();
        if (eventDuration > longPressTimeout) 
            onLongClick(view);
         else 
            onClick(view);
        
    
    return false;


如果视图不能正常点击,您需要调用view.setClickable(true) 以使view.isPressed() 检查生效。

【讨论】:

简洁优雅!【参考方案5】:

这是我发现的最简单的解决这个限制的方法:

//Define these variables at the beginning of your Activity or Fragment:
private long then;
private int longClickDuration = 5000; //for long click to trigger after 5 seconds

...

//This can be a Button, TextView, LinearLayout, etc. if desired
ImageView imageView = (ImageView) findViewById(R.id.desired_longclick_view);
imageView.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 ((System.currentTimeMillis() - then) > longClickDuration) 
            /* Implement long click behavior here */
            System.out.println("Long Click has happened!");
            return false;
           else 
            /* Implement short click behavior here or do nothing */
            System.out.println("Short Click has happened...");
            return false;
          
        
        return true;
      
    );

【讨论】:

【参考方案6】:

这就是我在处理 onclick 和自定义长按同一个按钮时所做的

public static final int LONG_PRESS_DELAY_MILLIS = 3000;

@Override
public void onClick(View v) 
    switch (v.getId()) 
        case R.id.btn_save:
            saveInfo();
            break;

        default:
            break;
    


@Override
public boolean onLongClick(View v) 
    switch (v.getId()) 
        case R.id.btn_save:
            initSendInfo(v, System.currentTimeMillis());
            return true;

        default:
            return false;
    


private void initSendInfo(final View v, final long startTime) 
    new Handler().postDelayed(new Runnable() 
        @Override
        public void run() 
            if (v.isPressed() && System.currentTimeMillis() - startTime >= LONG_PRESS_DELAY_MILLIS) 
                sendInfo();
                return;
             else if (!v.isPressed()) 
                return;
            
        
    , LONG_PRESS_DELAY_MILLIS);


【讨论】:

这很好用!要使 run 方法中的 v 和 startTime 可以访问,它们必须声明为 final private void initSendInfo(final View v, final long startTime) ... 编辑:对于 initSendInfo 方法,根据 Lipsyor 的 cmets,为参数添加了 final 关键字。 Thanyou Lipsyor。【参考方案7】:

这对我在API 29 有效,同时使用 Kotlin 保留按钮的视觉向下状态:

fun AppCompatButton.setOnVeryLongClickListener(
  holdDuration: Long = 1000L, 
  listener: () -> Unit
) 
    val handler = Handler()
    val originalText = this.text

    setOnTouchListener  v, event ->
        if (event?.action == MotionEvent.ACTION_DOWN) 
            // update the copy of the button
            text = "$originalText (KEEP HOLDING)"

            // fire the listener after our hold duration
            handler.postDelayed( listener.invoke() , holdDuration)
         else if(event?.action == MotionEvent.ACTION_UP) 
            // update the copy of the button
            text = "$originalText (TAP & HOLD)"

            // in case of an interruption, cancel everything
            handler.removeCallbacksAndMessages(null)
        

        // return false in order to retain the button's visual down state
        false
    


button.setOnVeryLongClickListener 
    println("very long!")

【讨论】:

以上是关于更改长点击延迟的主要内容,如果未能解决你的问题,请参考以下文章

Android系统判断长按和点击

更改 Qpushbutton 样式表图像时延迟 2 秒

UIwebView 链接延迟

Pygame幻灯片延迟异常长

延迟特定元素的 MathJax 处理

延迟加载