使用viewpager時,關于事件攔截處理的思考

public classTouchedViewPagerextendsViewPager

{

private floatmDownX;

private floatmDownY;

publicTouchedViewPager(Context context) {

this(context, null);

}

publicTouchedViewPager(Context context,AttributeSet attrs) {

super(context,attrs);

}

@Override

public booleandispatchTouchEvent(MotionEvent ev)

{

intposition = getCurrentItem();

intaction = ev.getAction();

switch(action)

{

caseMotionEvent.ACTION_DOWN:

// true: 孩子不想父容器攔截touch

getParent().requestDisallowInterceptTouchEvent(true);

mDownX= ev.getX();

mDownY= ev.getY();

break;

caseMotionEvent.ACTION_MOVE:

floatmoveX = ev.getX();

floatmoveY = ev.getY();

floatdiffX = moveX -mDownX;

floatdiffY = moveY -mDownY;

// 水平操作

// 從左向右 ---> diffX > 0

// 從右向左 ---> diffX <= 0

// 如果是水平操作,才考慮要不要攔截

if(Math.abs(diffX) > Math.abs(diffY))

{

if(position ==0)

{

// 1. 如果當前是第一頁(打開菜單或是上級viewpager選中上一頁)

if(diffX >0)

{

// 1-1. 如果從左向右拖動,父容器自己去響應touch

getParent().requestDisallowInterceptTouchEvent(false);

}

else

{

// 1-2. 如果從右向左拖動,自己響應

getParent().requestDisallowInterceptTouchEvent(true);

}

}

else if(position == getAdapter().getCount() -1)

{

// 2. 如果是最后一頁,父容器自己去響應touch

if(diffX >0)

{

// 2-1. 如果從左向右拖動,自己響應

getParent().requestDisallowInterceptTouchEvent(true);

}

else

{

// 2-2. 如果從右向左拖動,父容器自己去響應touch

getParent().requestDisallowInterceptTouchEvent(false);

}

}

else

{

// 3. 中間頁面,自己響應

getParent().requestDisallowInterceptTouchEvent(true);

}

}

else

{

getParent().requestDisallowInterceptTouchEvent(false);

}

break;

caseMotionEvent.ACTION_UP:

break;

default:

break;

}

return super.dispatchTouchEvent(ev);

}

}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容