主要思想是自定義被攔截的view,重寫dispatchTouchEvent這個方法,在這個方法裏寫攔截的規則。
例子請看下面的
public class InterceptViewPager extends ViewPager {
private float downX;
private float downY;
public InterceptViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public InterceptViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// 申請父控件不攔截事件
getParent().requestDisallowInterceptTouchEvent(true);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
System.out.println("movew...........");
float moveX = ev.getX();
float moveY = ev.getY();
// 是否是橫向滑動
float dx = moveX - downX;
float dy = moveY - downY;
if (Math.abs(dx) < Math.abs(dy)) {
// 縱向滑動
getParent().requestDisallowInterceptTouchEvent(false);// 攔截
} else {
// 申請父控件不攔截事件 條件
// 1. 如果是第一張圖片,從左往右滑動 父類攔截我的事件
if (getCurrentItem() == 0 && dx > 0) {
getParent().requestDisallowInterceptTouchEvent(false);// 攔截
} else if (getCurrentItem() == getAdapter().getCount() - 1
&& dx < 0) {
// 2. 最後一張圖片 從右往左滑動 父類攔截我的事件
getParent().requestDisallowInterceptTouchEvent(false);// 攔截
} else {
// 3. 不攔截事件
getParent().requestDisallowInterceptTouchEvent(true);// 不攔截
}
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}