Android当ScrollView滚动时禁用子视图的onTouch事件

3
在我的布局中,有一个ScrollView,其中包含一个VideoView和其他的TextView。
我的VideoView带有一个onTouch监听器用于开始播放视频:
viPlayer.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
         if (isPlaying) {
            isPlaying = false;
            viPlayer.stopPlayback();
         } else {
            isPlaying = true;
            viPlayer.start();
         }
         return false;
      }
});

我所遇到的问题是: 当用户将手指放在VideoView上并开始向下滚动ScrollView时,视频会开始播放。我希望当进行滚动时,ScrollView的子视图不应该执行任何操作。我发现ScrollView没有关于onScroll的监听器。我该如何解决这个问题?

1个回答

2

更新 让我解释一下发生了什么。子元素的触摸事件总是先被调用,只有在父元素的事件之后才会被调用。如果没有某些技巧,你试图做的事情很难实现。当你第一次触摸视频时,它的触摸事件被调用,之后才调用scrollview的事件。视频视图怎么知道你是否要滚动呢?它不知道你想做什么。那么你怎么知道是否应该播放视频呢?

所以我测试了一下,对我来说这个方法可行。将视频的触摸事件更改为这样。删除scrollview的触摸事件。注意使用return true而不是return false

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent)
        {
            switch (motionEvent.getAction()){
                case MotionEvent.ACTION_UP:
                    if (isPlaying) {
                     isPlaying = false;
                     viPlayer.stopPlayback();
                    } else {
                     isPlaying = true;
                     viPlayer.start();
                    }
                    break;
            }
            return true;
        }

这听起来像是一个非常好的解决方案,但是当我尝试将触摸监听器设置为ScrollView时,我得到了这个错误:The method requestDisallowInterceptTouchEvent(boolean) is undefined for the type VideoView,所以我猜测这不支持VideoView? - Alin
那意味着它没有那个方法。试试这个。设置一个布尔字段。并将其设置为false,而不是那个禁止调用,并在另一个上设置为true。然后在视频的触摸事件中检查该标志。我现在不在电脑旁边,但回到家后我会更新答案。 - Pedro Oliveira
它不起作用。viPlayeronTouchListener只接收到ACTION_DOWN事件,没有ACTION_UP事件,这真的很奇怪... - Alin
那可能是我犯的错误。我已经编辑了viPlayer touchListener。将if语句更改为在ACTION_UP case内部。 - Pedro Oliveira
那很奇怪。然后移除开关,尝试像这样。请查看答案。 - Pedro Oliveira
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接