开始啦。如果有不熟悉View事件分发机制的,大家先去自行复习一下哈,否则,哼哼哼,你懂得。看完估计你会拍脑袋。google一下 Android事件分发机制。
GO GO GO,进入主题了。鸡冻不。
先来个图,大家先看看有哪几种冲突。
一、父View和子View同方向滑动冲突。
例如:墨迹天气首页的天气展示页面和下面的新闻内容。听我口述哈(身边没有手机不能录屏,自行脑补哈。或者可以打开手看看)
jianshu1.png
二、父View和自View不同方向的滑动冲突。
例如:现在主流的新闻App估计都是这样的,外部是ViewPager,内部是ListView。
jianshu2.png
其实我们在大部分工作中遇到都是这俩种中的一个。下面我用2个demo来展示一下改怎么处理。
一、在父View中处理(外部处理方法)
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean isIntercept = false;
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if(根据滑动方向 && 业务逻辑处理){
isIntercept = true;
}
break;
case MotionEvent.ACTION_UP:
break;
}
return isIntercept;
}
二、在子View中处理
1、首先把父View的onInterceptTouchEvent做如下处理,把选择权交给子View(如果对于这里处理有疑问的可以给我留言,咱们讨论一下)
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean isIntercept = true;
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
isIntercept = false;
break;
}
return isIntercept;
}
2、重写子View dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
if(根据滑动方向 && 业务逻辑处理){
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
break;
}
return super.dispatchTouchEvent(ev);
}
1、分析这两种处理冲突,个人觉得使用第一种会比较符合我们的习惯。符合Android的从上往下的事件分发机制,看个人习惯和具体业务。
这里举例说明了改怎么样解决事件冲突,由于能力有限,文中有不妥的或者不对地方,欢迎指正。可以留言,或者邮件peiboning@gmail.com
万变不离其宗。
马克思老师说了:具体问题具体分析。
About Me
Android开发工程师一枚。欢迎点赞哈,老铁666.