Android開發(fā)——View滑動(dòng)沖突解決方案
來源:程序員人生 發(fā)布時(shí)間:2016-10-10 08:17:23 閱讀次數(shù):2541次
0. 前言
我們在Android開發(fā)——事件分發(fā)機(jī)制詳解中深入學(xué)習(xí)了事件分發(fā)機(jī)制,為我們解決Android開發(fā)中的滑動(dòng)沖突問題做了初步準(zhǔn)備。針對滑動(dòng)沖突這里給出兩種解決方案:外部攔截法和內(nèi)部攔截法。
轉(zhuǎn)載請注明出處:http://blog.csdn.net/seu_calvin/article/details/52600422
1.外部攔截法
外部攔截法是指事件都先經(jīng)過父控件的攔截處理,這里需要注意的是ACTION_DOWN事件父控件中必須返回false,由于如果父控件攔截了DOWN,后續(xù)事件也會(huì)交給它處理,子控件就沒法拿到事件了,具體緣由已在前言中的鏈接文中介紹過了。接著就是MOVE事件,如果父控件需要此攔截事件,就攔截,不需要就不攔截。最后在UP事件中也默許返回false。
外部攔截法不需要改寫子控件,只需要改寫父控件的onInterceptTouchEvent方法,代碼以下:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted=false;
switch (action) {
case MotionEvent.ACTION_MOVE:
intercepted=false;
break;
case MotionEvent.ACTION_MOVE:{
if(父控件需要處理此事件){
intercepted=true;}
else{
intercepted=false;}
break;
}
case MotionEvent.ACTION_UP: {
intercepted=false;
break;
}
//...
return intercepted;
}
2.內(nèi)部攔截法
內(nèi)部攔截法是指父控件設(shè)置為不攔截除ACTION_DOWN之外的任何事件,當(dāng)DOWN傳遞給子元素時(shí),通過設(shè)置getParent().requestDisallowInterceptTouchEvent(false)使父控件不攔截任何事件,此時(shí)所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則可在ACTION_MOVE中通過設(shè)置getParent().requestDisallowInterceptTouchEvent(true)使父控件去攔截MOVE和UP事件并由自己消耗該事件。
我們需要修改子元素的dispatchTouchEvent方法:
public boolean dispatchTouchEvent(MotionEventevent) {
switch (action) {
case MotionEvent.ACTION_DOWN:{
//使父控件不攔截DOWN之外的1系列事件
getParent().requestDisallowInterceptTouchEvent(true);
break;}
case MotionEvent.ACTION_MOVE:{
if(父控件需要處理此事件){
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
}
case MotionEvent.ACTION_UP: {
break;
}
...
return super.dispatchTouchEvent(event);
}
固然,還需要修改父容器的onInterceptTouchEvent()方法,使其默許攔截除DOWN之外的事件,代碼以下:
@Override
publicboolean onInterceptTouchEvent(MotionEvent ev) {
intaction=ev.getAction();
if(action==MotionEvent.ACTION_DOWN){
return false;
}else {
return true;
}
}
以上就是兩種解決滑動(dòng)沖突的解決方案,在其中的條件判斷代碼里加入自己的業(yè)務(wù)邏輯判斷便可。
轉(zhuǎn)載請注明出處:http://blog.csdn.net/seu_calvin/article/details/52600422
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)