Android滑動事件沖突詳解(一)
首先,我們假設(shè)這樣一個場景:一個ViewPager里面嵌套一個ViewPager,內(nèi)部滑動方向和外部滑動方向一樣時,該怎么解決這一沖突呢?
針對滑動沖突這里給出兩種解決方案:外部攔截法,內(nèi)部攔截法。
外部攔截法
外部攔截法是指點擊事件都先經(jīng)過父容器的攔截處理,如果父容器需要此攔截事件,就攔截,不需要就不攔截,這種方法比較符合點擊事件的分發(fā)機制。這種方法代碼如下:
@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;
}
上述代碼是外部攔截的典型邏輯,只需要重寫onInterceptTouchEvent()方法,修改父容器當(dāng)前需要的事件即可。
內(nèi)部攔截法
內(nèi)部攔截法是指:父容器不攔截任何事件,所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則就交由父容器處理。這種方法與Android中的事件分發(fā)機制不一致,需要配合 requestDisallowInterceptTouchEvent()方法才能正常工作。我們需要重寫子元素的,代碼如下:
public boolean dispatchTouchEvent(MotionEvent event) {
...
switch (action) {
case MotionEvent.ACTION_MOVE:
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
if(子元素需要處理此事件)
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP: {
break;
}
...
return super.dispatchTouchEvent(event);
;
}
當(dāng)然,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action=ev.getAction();
if(action==MotionEvent.ACTION_DOWN){
return false;
}else {
return true;
}
}
更多關(guān)于滑動功能的文章,請點擊專題: 《Android滑動功能》
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android獲取系統(tǒng)儲存以及內(nèi)存信息的方法(一)
這篇文章主要為大家詳細(xì)介紹了Android獲取系統(tǒng)儲存以及內(nèi)存信息的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
android非RxJava環(huán)境下使用Handler實現(xiàn)預(yù)加載
這篇文章主要介紹了android非RxJava環(huán)境下使用Handler實現(xiàn)預(yù)加載的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Flutter使用Provider進行狀態(tài)管理的實現(xiàn)
Provider是Flutter中一個非常流行的狀態(tài)管理工具,它可以幫助開發(fā)者更有效地管理Widget樹中的數(shù)據(jù),本文主要介紹了Flutter使用Provider進行狀態(tài)管理的實現(xiàn),感興趣的可以了解一下2024-04-04
Android使用SQLiteDatabase增刪改查(CRUD)的操作教程
在 Android 中使用 SQLiteDatabase 進行增刪改查操作是開發(fā)中的核心技能之一,下面我將詳細(xì)說明如何使用 SQLiteDatabase 進行 CRUD 操作,需要的朋友可以參考下2025-04-04
Android 模擬器(emulator-5554...)出現(xiàn)錯誤解決辦法
這篇文章主要介紹了Android 模擬器出現(xiàn)錯誤解決辦法的相關(guān)資料,如:Unable to get view server version from device,F(xiàn)ailed to install helloworld.apk on device 'emulator-5554': timeout,這種常見錯誤,解決辦法,需要的朋友可以參考下2016-11-11
Android中查看USB連接的外接設(shè)備信息的代碼實例
這篇文章主要介紹了Android中查看USB連接的外接設(shè)備信息的代碼實例,需要的朋友可以參考下2014-04-04

