因为最近在学习recycleView,所以就尝试把项目中的listview换成recycleView。然而这一换出问题了 ,上下滑动的时候总是 会导致左右滑动的slidingMenu 乱滑。导致recycleview上下滑动失灵。
为了解决问题 我就不停的找资料。然后找到了touch事件的传递机制 ,我就开始调试输出。 发现滑动事件总是被上层的slidingMenu给拦截了!
至于touch事件的传递机制,百度一下你就知道 。
大概就是 slidingMenu的 onInterceptTouchEvent 的返回值为true的时候 就会不继续往子VIew传递 事件了 。 滑动事件就会被slidingMenu的ontouch给消费掉了。
这样就导致recycleview 就收不到滑动事件 。 我一开始的想法是 将slidingMenu的 onInterceptTouchEvent 返回值改为false 。 然后在recycleview 中重写ontouch事件
根据滑动方向来判断是否消费这个事件 ,然后在slidingMenu的ontouch中再判断一次 。。。
后来想到 只要重写slidingMenu的onInterceptTouchEvent不就可以了吗 因为slidingMenu是一个左右滑动的控件 所以判断也很简单
只要判断左右滑动的数值大还是上下滑动的数值大就可以了
具体方法如下
//记录触摸事件的开始坐标点
private float startPos[]=new float[2];
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action=ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
//记录touch事件开始的坐标
startPos[0]=ev.getX();
startPos[1]=ev.getY();
break;
case MotionEvent.ACTION_MOVE:
//捕获移动事件
float x=ev.getX();
float y=ev.getY();
//计算和初始坐标的绝对值 如果左右移动距离 大于上下移动距离 拦截这次的touch事件 反之下发给子view处理
if(Math.abs(x-startPos[0])>Math.abs(y-startPos[1])){
return true;
}else{
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
额 搞定 不过并不清楚 会不会有啥其他bug 反正是解决了我现在的问题QAQ 如有错误 希望各位前辈能指出