ViewDragHelper使用时遇到的问题

ViewDragHelper使用时遇到的问题

今天在写一个用ViewDragHelper写一个上滑菜单的时候遇到了一个解决不了的问题。应该就是和ViewGroup的时间分发机制有关的问题。暂时想不到快捷的方法来解决这个问题。
怎么描述呢,自定义一个ViewGroup的时候,为了测量和摆放的方便,选择继承了FrameLayout,布局文件中放了两个LinearLayout。放在前面的LinearLayout是被下一个覆盖的。


  
  

     

然后把InterceptTouchEvent()事件和onTouchEvent()事件都交给ViewDragHelper的shouldInterceptTouchEvent(ev)和processTouchEvent(event)事件去处理。可以如果这样写,上层的LinearLayout根本没机会去处理自己的滑动事件,反而给被覆盖在底下的ListView给消费了,如果InterceptTouchEvent()事件返回True,那盖在上面的LinearLayout能顺利处理自己的滑动事件,但是就算把它移走了,事件还是被CustomView给拦截了,ListView没法获得消费事件的机会。

按照View的事件分发机制,确实是这么回事,从外层的ViewGroup往里面传,如果子View是ViewGroup,继续往里传,直到遍历每个View,有消费的能力的话,就把事件给消费了,如果遍历全部的子View没有能消费的,就调用super.onDispatchTouchEvent()往上层传递,看父节点的ViewGroup的onTouchEvent()是否消费,ViewGroup是默认不拦截事件的。可是这儿ListView都没遮盖住了,相当于不可见的情况下,还是会传递过去吗?看来需要再去找找相关的资料,希望能顺利解决这个问题。


2015年9月13日21:12:25重新编辑
似乎找到问题所在了。好像在于ViewDragHelper.CallBack的clampViewPositionVertical()这个回调方法,Api文档上说,这个方法是限制子View的运动的,默认实现是不允许移动的,必须重写此方法,才能使子View在垂直方向上移动。大致理解应该是,手指拖动的View,拖动到哪个位置了,具体产生了多少偏移量,回掉的参数作为参考返回给我们,具体让我们来实现该怎么移动视图,典型的方法回掉。我没有把盖住的ViewGroup的移动禁止掉,导致ListView所在的整个ViewGroup在移动,ListView却没办法正常的滚动,在这个方法中判断掉除了我想移动的View外,ListView终于能正常滚动了。在此记下一笔,再接再厉努力学习。

你可能感兴趣的:(ViewDragHelper使用时遇到的问题)