首先雹拄,我們假設(shè)這樣一個(gè)場景:一個(gè)ViewPager里面嵌套一個(gè)ViewPager艳狐,內(nèi)部滑動(dòng)方向和外部滑動(dòng)方向一樣時(shí)聘殖,該怎么解決這一沖突呢?
針對滑動(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()方法虑灰。具體代碼如下:
1publicclassMyViewPagerextendsViewPager {2privateintstartX;3privateintstartY;4publicMyViewPager(Context context) {5super(context);6}789@Override10publicbooleanonInterceptTouchEvent(MotionEvent ev) {11switch(ev.getAction())12{13caseMotionEvent.ACTION_DOWN:14startX= (int) ev.getX();15startY= (int) ev.getY();16break;17caseMotionEvent.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}26caseMotionEvent.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)是父容器不能攔截子元素需要的事件。下面來看具體代碼:
1publicbooleandispatchTouchEvent(MotionEvent event) {2...34switch(action) {5caseMotionEvent.ACTION_MOVE:6getParent().requestDisallowInterceptTouchEvent(true);78break;9caseMotionEvent.ACTION_MOVE:10if(子元素需要處理此事件)11getParent().requestDisallowInterceptTouchEvent(true);1213break;14caseMotionEvent.ACTION_UP: {15break;16}17...18returnsuper.dispatchTouchEvent(event);19;20}
當(dāng)然洲脂,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:
1@Override2publicbooleanonInterceptTouchEvent(MotionEvent ev) {34intaction=ev.getAction();5if(action==MotionEvent.ACTION_DOWN){6returnfalse;7}else{8returntrue;9}10}
運(yùn)行結(jié)果如圖:
以上就是兩種解決滑動(dòng)沖突的解決方案剧包。
public class MyViewPager extends ViewPager {
private int startX;
private int startY;
public MyViewPager(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
startX= (int) ev.getX();
startY= (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int dX= (int) (ev.getX()-startX);
int dY= (int) (ev.getY()-startX);
if(Math.abs(dX)>Math.abs(dY)){//左右滑動(dòng)
return true;
}else {//上下滑動(dòng)
return false;
}
case MotionEvent.ACTION_UP:
break;
}
return super.onInterceptTouchEvent(ev);
}
}
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);
;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action=ev.getAction();
if(action==MotionEvent.ACTION_DOWN){
return false;
}else {
return true;
}
}
http://www.cnblogs.com/yxx123/p/5250101.html