首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >onInterceptTouchEvent,onTouchEvent只看到ACTION_DOWN

onInterceptTouchEvent,onTouchEvent只看到ACTION_DOWN
EN

Stack Overflow用户
提问于 2012-09-25 23:35:06
回答 4查看 14.3K关注 0票数 6

我有一个顶级的ViewGroup,我称之为SliderView,在它中我想检测滑动。这主要是有效的,但一个奇怪的失败仍然存在。

SliderView的本质是覆盖onInterceptTouchEvent,一旦用户实际滑动,返回"true“以防止其他视图查看MotionEvent。下面是一段代码:

代码语言:javascript
运行
复制
public class SliderView extends ViewGroup
{
  enum MoveState { MS_NONE, MS_HSCROLL, MS_VSCROLL };
  private MoveState moveState = MoveState.MS_NONE;

  ... other code ...

  public boolean onInterceptTouchEvent(MotionEvent e)
  {
    final int action = e.getAction();
    switch (action & MotionEvent.ACTION_MASK)
    {
      case MotionEvent.ACTION_DOWN:
        moveState = MoveState.MS_NONE;
        break;

      case MotionEvent.ACTION_MOVE:
        if (moveState == MoveState.MS_NONE)
        {
          if (motion is horizontal)
          {
            moveState = MoveState.MS_VSCROLL;
            return true;
          }
          else
            moveState = MoveState.MS_VSCROLL; // let child window handl MotionEvent
        }
        else if (moveState == MoveState.MS_HSCROLL)
          return true; // don't let children see motion event.
    }
    return super.onInterceptTouchEvent (e);
  }

  ... other code ...
}

我的理解是,我的SliderView (这是最外层的视图)应该总是使用onInterceptTouchEvent。然而,在我的一个测试中,最高级别的子级是一个,在下面的情况下,这似乎不是。

当顶层的子级是ScrollView时,onInterceptTouchEvent得到ACTION_MOVE,我的代码做我想做的事情。在另一种情况下,顶级子级是LinearLayout,有时会失败:它总是获得ACTION_DOWN,但只有当用户触摸到LinearLayout中的小部件时才获得ACTION_MOVE;如果触摸到空白区域,则只有ACTION_DOWN通过。

我将注意到,它的行为就像是在SliderView之外发生了失败案例的接触。但是,如果是这样的话,我为什么要得到ACTION_DOWN事件呢?

第二个注意事项:查看ScrollView的源代码,我看到它正在检查"inChild";我还没有弄清楚这是为了什么,以及它可能是如何相关的。

EN

回答 4

Stack Overflow用户

发布于 2013-01-15 06:37:33

由于user123321 这里的回答

只有当父视图有一个从onInterceptTouchEvent返回"true“的子视图时,才会调用onTouchEvent。一旦子返回true,父级现在就有机会拦截该事件。

票数 6
EN

Stack Overflow用户

发布于 2018-01-11 11:13:58

你只需要打电话

代码语言:javascript
运行
复制
requestDisallowInterceptTouchEvent(true);

从父母的角度来看,就像这样-

代码语言:javascript
运行
复制
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            view.getParent().requestDisallowInterceptTouchEvent(true);
            switch(motionEvent.getActio){
            }

            return false; 

         }
票数 3
EN

Stack Overflow用户

发布于 2013-06-01 04:40:00

来自安卓开发者的参考资料(http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent) )

"2.此外,通过从onTouchEvent()返回true,您将不会在onInterceptTouchEvent()中接收到任何以下事件,所有触摸处理都必须在onTouchEvent()中进行,与正常情况一样。

也许是因为你的onTouchEvent总是返回真..?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12592610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档