概述
滑动冲突我想大家在日常开发中会经常遇到,要解决滑动冲突其实没有那么难,好多人在听到”View的滑动冲突”这句话的时候就槽*了,突然脑子一片空白。
所以我写了这篇博文来帮大家很容易的解决这个问题,在这篇博文中我们不提源码、不提View的事件分发机制,直接给出可以解决绝大部份滑动冲突的代码。
常见的冲突场景
- A控件与B控件同向滑动(A为父控件,B为子控件)
思路:即然两个控件都可以滑动,都在抢这个滑动事件,而且很显然A做为父控件那么这个滑动事件被它优先抢到,所以当我们想让B响应时A还是把这个事件给拦截了,所以在我们想让B响应时应该通知A不要拦截。
解决方案
重写B控件中的dispatchTouchEvent()方法,如果有了解View的事件分发机制的朋友应该知道,不知道的也不要在意,照着写就行。
在重写dispatchTouchEvent()我们可以拿到View的MotionEvent。
用MotionEvent来判断用户的操作,从而来判断是否让A(父控件)来拦截。
是否拦截就是一句代码:getParent().requestDisallowInterceptTouchEvent(true);
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// 在手按下(触摸)屏幕的那一刻
/**
在这里写下你的逻辑判断,然后调用requestDisallowInterceptTouchEvent来是否拦截。
ev可以拿到用户在屏幕上操作的各种数据,不了解同学可以去学习一下MotionEvent,这里就不多说了。
*/
// true:请求不拦截
// false:请求拦截
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
// 移动的时候
break;
case MotionEvent.ACTION_UP:
// 抬起的时候
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
第一次写博文可能有很多不足的地方,知识也讲得不够细,如果大家看了之后有什么疑问可以联系我,而且后面也会进行修改和更新,以后写出更好的博文来分享。