Android開發——View滑動沖突解決方案
來源:程序員人生 發布時間:2016-10-10 08:17:23 閱讀次數:2551次
0. 前言
我們在Android開發——事件分發機制詳解中深入學習了事件分發機制,為我們解決Android開發中的滑動沖突問題做了初步準備。針對滑動沖突這里給出兩種解決方案:外部攔截法和內部攔截法。
轉載請注明出處:http://blog.csdn.net/seu_calvin/article/details/52600422
1.外部攔截法
外部攔截法是指事件都先經過父控件的攔截處理,這里需要注意的是ACTION_DOWN事件父控件中必須返回false,由于如果父控件攔截了DOWN,后續事件也會交給它處理,子控件就沒法拿到事件了,具體緣由已在前言中的鏈接文中介紹過了。接著就是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.內部攔截法
內部攔截法是指父控件設置為不攔截除ACTION_DOWN之外的任何事件,當DOWN傳遞給子元素時,通過設置getParent().requestDisallowInterceptTouchEvent(false)使父控件不攔截任何事件,此時所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則可在ACTION_MOVE中通過設置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;
}
}
以上就是兩種解決滑動沖突的解決方案,在其中的條件判斷代碼里加入自己的業務邏輯判斷便可。
轉載請注明出處:http://blog.csdn.net/seu_calvin/article/details/52600422
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈