码农-小林 2024-08-12 09:00 采纳率: 54.8%
浏览 13
已结题

对于RecyclerView,你可以使用addOnItemTouchListener方法来添加触摸监听器

对于RecyclerView,你可以使用addOnItemTouchListener方法来添加触摸监听器,为什么在onInterceptTouchEvent中不执行MotionEvent.ACTION_UP和在onTouchEvent中不执行拿不到MotionEvent.ACTION_DOWN

img

img

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2024-08-12 09:04
    关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在onInterceptTouchEvent中不执行MotionEvent.ACTION_UP和在onTouchEvent中不执行拿不到MotionEvent.ACTION_DOWN是两个不同的问题。

    首先,让我们看看这两个事件的区别:

    • ACTION_UP:当用户向上滑动一个item时触发的动作。这意味着在这个方向上,用户的手指已经到达了屏幕的顶部。在这种情况下,ACTION_UP方法会被调用,但不会执行任何其他的动作。
    • ACTION_DOWN:当用户向下滑动一个item时触发的动作。这意味着在这个方向上,用户的手指已经到达了屏幕的底部。在这种情况下,ACTION_DOWN方法会被调用,但不会执行任何其他的动作。

    然后我们来看看在onInterceptTouchEvent中为什么这两个事件都不会被执行的原因:

    1. ACTION_UP和ACTION_DOWN都是处理用户滑动事件的方法,但是在ACTION_UP方法中,我们可以通过判断滑动的方向(向上或向下)来决定是否执行ACTION_DOWN方法。但是,在ACTION_DOWN方法中,我们需要检测滑动的方向,但是我们还没有定义滑动的方向。因此,ACTION_DOWN方法不会被执行。

    2. ACTION_DOWN方法没有对应的ACTION_UP方法,这使得ACTION_DOWN方法不能被执行。如果ACTION_DOWN方法需要被执行,那么ACTION_UP方法也应该被被执行。如果没有合适的ACTION_DOWN方法,那么ACTION_DOWN方法就不会被执行。

    以下是如何解决这个问题的步骤:

    1. 在onInterceptTouchEvent中添加ACTION_DOWN方法。这样,ACTION_DOWN方法就会被执行,并且它会阻止ACTION_UP方法的被执行。
    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        // 判断滑动的方向
        int direction = (e.getAction() == MotionEvent.ACTION_DOWN ? 1 : -1);
    
        // 添加ACTION_DOWN方法
        addOnTouchListener(new TouchEventListener() {
            @Override
            public void onTouchEvent(MotionEvent e) {
                e.dispatchAction(direction);
            }
        });
    
        return super.onInterceptTouchEvent(e);
    }
    
    1. 在onTouchEvent中添加ACTION_UP方法。这样,ACTION_UP方法就可以被执行,而且ACTION_DOWN方法也不会被执行。
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        // 添加ACTION_UP方法
        addOnTouchListener(new TouchEventListener() {
            @Override
            public void onTouchEvent(MotionEvent e) {
                e.dispatchAction(-direction);
            }
        });
    
        return super.onTouchEvent(e);
    }
    

    请注意,以上代码只是一个示例,实际的实现可能会有所不同。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日
  • 创建了问题 8月12日