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);
}
}