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