【问题标题】:Android disable child onTouch when ScrollView scrollsScrollView滚动时Android禁用子onTouch
【发布时间】:2014-10-06 16:26:26
【问题描述】:

在我的布局中,我有一个 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 时,视频开始播放。我希望在执行 Scroll 时,ScrollView 的子视图不应该做任何事情。我看到 ScrollView 的 onScroll 没有侦听器。我该如何解决这个问题?

【问题讨论】:

    标签: android ontouchlistener android-scrollview ontouch onscrolllistener


    【解决方案1】:

    更新 让我解释一下发生了什么。孩子的触摸事件总是首先被调用,并且只有在父事件被调用之后。如果没有一些技巧,你正在尝试做的事情很难。当您第一次触摸视频时,它的触摸事件被调用,然后滚动视图的事件被调用。视频视图如何知道您是否要滚动?它不知道你正在尝试做什么。那么你怎么知道你是否应该播放视频呢?

    所以我对此进行了测试,这对我有用。将您的视频触摸事件更改为此。删除滚动视图触摸事件。注意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 不支持这个?跨度>
    • 那意味着它没有那个方法。试试这个。设置一个布尔字段。并将其设置为 false 而不是那个 disallow 调用,并且在另一个上设置为 true 。然后在视频的触摸事件上检查该标志。我不在电脑上,但当我回到家时,我会更新答案
    • 好的,我已经编辑了解决方案。请注意,我已经更改了视频播放器触摸监听器的代码。你只需要控制你是否点击滚动视图
    • 它不工作。 viPlayer onTouchListener 只接收事件 ACTION_DOWN 而没有 ACTION_UP 这真的很奇怪......
    • 这可能是我犯的一些错误。我已经编辑了 viPlayer touchListener。将 if 更改为 ACTION_UP 案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多