父容器能監(jiān)聽上下左右移動(dòng)所有事件划煮,scrollview和viewpager药版,其他的父容器(linearlayout,realtivielayout,framlayout,)沒有攔截支持移動(dòng)事件
首先,我們假設(shè)這樣一個(gè)場景:一個(gè)ViewPager里面嵌套一個(gè)ViewPager,內(nèi)部滑動(dòng)方向和外部滑動(dòng)方向一樣時(shí),該怎么解決這一沖突呢?
針對(duì)滑動(dòng)沖突這里給出兩種解決方案:外部攔截法拳话,內(nèi)部攔截法。
外部攔截法
情景:一個(gè)ViewPager嵌套了一個(gè)Listview种吸,一個(gè)是左右滑動(dòng)弃衍,一個(gè)上下滑動(dòng)。這個(gè)時(shí)候我們可以用外部攔截法坚俗,來處理沖突镜盯。在父容器ViewPager中,重寫onInterceptTouchEvent()方法猖败,判斷當(dāng)左右滑動(dòng)時(shí)就攔截事件速缆,上下滑動(dòng)就不攔截,將事件交由子元素Listview來處理恩闻。首先我們需要重寫一個(gè)ViewPager艺糜,叫MyViewPager,然后重寫onInterceptTouchEvent()方法幢尚。具體代碼如下:
1publicclassMyViewPagerextends ViewPager { 2privateint startX; 3privateint startY; 4public MyViewPager(Context context) { 5super(context); 6? ? } 7 8 9? ? @Override10publicboolean onInterceptTouchEvent(MotionEvent ev) {11switch (ev.getAction())12? ? ? ? {13case MotionEvent.ACTION_DOWN:14startX= (int) ev.getX();15startY= (int) ev.getY();16break;17case MotionEvent.ACTION_MOVE:1819intdX= (int) (ev.getX()-startX);20intdY= (int) (ev.getY()-startX);21if(Math.abs(dX)>Math.abs(dY)){//左右滑動(dòng)22returntrue;23}else{//上下滑動(dòng)24returnfalse;25? ? ? ? ? ? ? ? }26case MotionEvent.ACTION_UP:27break;28? ? ? ? }29returnsuper.onInterceptTouchEvent(ev);30? ? }31}
這樣就解決這種情況下的滑動(dòng)沖突破停, 程序演示入下圖:?
上述代碼是外部攔截的典型邏輯,只需要重寫onInterceptTouchEvent()方法侠草,修改父容器當(dāng)前需要的事件即可辱挥。
內(nèi)部攔截法
情景:一個(gè)ViewPager嵌套了一個(gè)ViewPager犁嗅,兩個(gè)都是左右滑動(dòng)边涕。這個(gè)時(shí)候我們可以用內(nèi)部攔截法,來處理沖突褂微。即重寫子元素的dispatchTouchEvent()方法功蜓,并調(diào)用getParent().requestDisallowInterceptTouchEvent(true)是父容器不能攔截子元素需要的事件。下面來看具體代碼:
1publicboolean dispatchTouchEvent(MotionEvent event) { 2? ? ? ? ... 3 4switch (action) { 5case MotionEvent.ACTION_MOVE: 6getParent().requestDisallowInterceptTouchEvent(true); 7 8break; 9case MotionEvent.ACTION_MOVE:10if(子元素需要處理此事件)11getParent().requestDisallowInterceptTouchEvent(true);1213break;14case MotionEvent.ACTION_UP: {15break;16? ? ? ? }17? ? ? ? ...18returnsuper.dispatchTouchEvent(event);19;20}
當(dāng)然宠蚂,還需要修改父容器的onInterceptTouchEvent()方法式撼,代碼如下:
1@Override 2publicboolean onInterceptTouchEvent(MotionEvent ev) { 3 4intaction=ev.getAction(); 5if(action==MotionEvent.ACTION_DOWN){ 6returnfalse; 7}else { 8returntrue; 9? ? ? ? ? ? }10}
運(yùn)行結(jié)果如圖:
以上就是兩種解決滑動(dòng)沖突的解決方案。