簡(jiǎn)單來說浦妄,處理滑動(dòng)沖突见芹,主要還是對(duì)view的事件分發(fā)的攔截的處理,原則就是 哪個(gè)view需要響應(yīng)對(duì)應(yīng)的滑動(dòng)事件阅懦,就讓其去攔截點(diǎn)擊事件徘铝。
有下面兩種方法:
- 外部攔截法(推薦):在父容器中處理點(diǎn)擊事件onInterceptTouchEvent()
- 內(nèi)部攔截法:父容器不處理任何事件惯吕,決定權(quán)都交給子元素
外部攔截法
可以用如下偽代碼處理:
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean intercepted = false;
int x = event.getX();
int y = event.getY();
switch(event.getActioin()) {
case MotionEvent.ACTION_DOWN:
// 必須為false废登,否則后續(xù)事件無法傳遞給子元素
intercepted = false;
break;
case MotionEvent.ACTION_MOVE:
if(父容器需要處理點(diǎn)擊事件) {
intercepted = true;
} else {
intercepted = false;
}
break;
case MotionEvent.ACTION_UP:
intercepted = false;
break;
default:
break;
}
mLastX = x;
mLastY = y;
return intercepted;
}
這種方法使用起來比較簡(jiǎn)單堡距,推薦使用兆蕉。
內(nèi)部攔截法
下面再看一下由子元素?cái)r截法的方法:
public boolean onInterceptTouchEvent(MotionEvent event) {
int x = event.getX();
int y = event.getY();
switch(event.getActioin()) {
case MotionEvent.ACTION_DOWN:
// 必須,否則后續(xù)事件無法傳遞給子元素
parent.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastX;
int deltaY = y - mLastY;
if(父容器需要處理點(diǎn)擊事件) {
parent.requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
mLastX = x;
mLastY = y;
return super.dispatchInterceptTouchEvent(event);
}
這種方法用起來比較麻煩易稠。