使用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);

}

}

你可能感兴趣的:(使用viewpager时,关于事件拦截处理的思考)