【问题标题】:android: How to increase long press time for listview items in android?android:如何增加android中listview项目的长按时间?
【发布时间】:2017-05-10 16:17:01
【问题描述】:

我有一个自定义listview,其中的项目是滚动水平。我想对 listview 项目执行单点触摸和长按 5 秒。这个怎么做。如何将 listview 项目的 longpress 时间间隔增加到 5 秒。

【问题讨论】:

    标签: android long-press


    【解决方案1】:

    你可以setOnItemLongClickListener,然后你可以将你触摸的视图设置为OnTouchListener,你可以记录ACTION_DOWN的时间和ACTION_UP的时间,这样你就可以计算时间是否超过5秒在ACTION_DOWNACTION_UP 之间。

    【讨论】:

    • IMO 这将是一个不自然的用例,因为我们通常在释放手指之前等待弹出窗口或任何更改,用户通常不会数 1.2.3.4.5 然后释放。
    • 澄清 Enzokie 的评论:如果您等待 ACTION_UP 计算时间,用户无法知道他们何时持有足够长的时间。相反,如果手指仍在触摸,则应在 ACTION_DOWN 之后延迟触发操作。请参阅丹佛的回答。
    【解决方案2】:

    您无法更改延迟。它在 android 框架中是硬连线的。几天前我也遇到了同样的问题。

    您可以手动使用setOnTouchListener

    例子:

    private long then;
    private int longClickDur= 5000; //5 seconds
    
    
    //you can use any view you want
    ImageView imageView = (ImageView) findViewById(R.id.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) {
                /* Long click behaviour will go here*/
                Toast.makeText(context, "yay, long click", Toast.LENGTH.SHORT);
                return false;
              } else {
                /* LONG CLICK FAILED*/
                Toast.makeText(context, "TRY AGAIN", Toast.LENGTH.SHORT);
                return false;
              }
            }
            return true;
          }
        });
    

    【讨论】:

    • 我做了同样的事情,但在这种情况下,列表视图的水平滚动不会发生......
    • 这与 Enzokie 在 juemuren 的回答中提到的问题相同:这不会向用户提供任何关于他们何时保持触摸足够长的反馈。请参阅丹佛的答案以获得更好的方法。
    • 这是长按,不是长按
    【解决方案3】:

    这更准确地复制了 onLongPress,因为它不会在执行前等待用户抬起手指。专为 ViewPager 编写,但应该能够应用类似的逻辑。

    // long press duration in milliseconds
    public static final int LONG_PRESS_DURATION = 2000;
    
    private boolean mIsTouching = false;
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    
        if (event.getAction() == event.ACTION_DOWN) {
            mIsTouching = true;
        } else if (event.getAction() == event.ACTION_UP) {
            mIsTouching = false;
        }
    
        return super.onTouchEvent(event);
    }
    
    @Override
    public void onLongPress(MotionEvent event) {
    
        // subtracts the system set timeout since that time has already occured at this point
        int duration = LONG_PRESS_DURATION - getLongPressTimeout();
    
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (mIsTouching) {
                    do something...
                }
            }
        }, duration > 0 ? duration : 0);
    }
    

    【讨论】:

    • onLongPress(MotionEvent) 方法在哪里?我在ViewPager 中找不到它。您是指View.OnLongClickListener 中的onLongClick(View view) 吗?
    • 谢谢。为我工作,尽管我不得不从您的解决方案中删除 getLongPressTimeout()。
    • 这可以通过在onTouchEvent/ACTION_DOWN 中启动 postDelayed 来更简单地完成。在那里,没有必要减去 getLongPressTimeout。不需要onLongPress
    【解决方案4】:

    这是我的实现:(你不需要释放来拍摄动作)

    Handler longTouchHandler= new Handler();
    static final int longduration=10000;//10000ms press duration
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == event.ACTION_DOWN) {
            longTouchHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Log.w("Longpress","longpressed");
                }
            }, longduration);
            return true;
        }
        else if (event.getAction() == event.ACTION_UP) {
            longTouchHandler.removeCallbacksAndMessages(null);
            Log.w("Longpress","cancelled");
        }
    
        return super.onTouchEvent(event);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2014-07-11
      • 2021-12-12
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多