ViewPager的嵌套使用会涉及到事件传递的处理。
不能滑动的ViewPager
package com.itheima.zhbj48.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 不能滑动的ViewPager
*/
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
// 事件分发
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
/**
* 事件拦截
*
* 返回false, 表示不拦截触摸事件,让子控件有机会响应事件, 用于ViewPager嵌套ViewPager时使用
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
/**
* 拦截所有的触摸事件, 不做任何处理
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
}
头条新闻横向滑动的ViewPager
package com.itheima.zhbj48.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 头条新闻横向滑动的ViewPager
*/
public class HorizontalScrollViewPager extends ViewPager {
private int startX;
private int startY;
public HorizontalScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HorizontalScrollViewPager(Context context) {
super(context);
}
/**
* 1. 当右划时,而且当前item是第一个,需要父控件拦截; 2. 当左划时,当前item是最后一个,需要父控件拦截; 3. 当上下划动时,
* 需要父控件拦截
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);// 请求父控件,以及祖宗控件,不要拦截我的事件,
startX = (int) ev.getX();
startY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getX();
int endY = (int) ev.getY();
int dx = endX - startX;
int dy = endY - startY;
// 判断是否是左右划
if (Math.abs(dx) > Math.abs(dy)) {// 左右滑动
if (dx > 0) {// 向右滑动
if (getCurrentItem() == 0) {// 当前item是第一个
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
} else {
if (getCurrentItem() == getAdapter().getCount() - 1) {// 当前item是最后一个
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
}
} else {
getParent().requestDisallowInterceptTouchEvent(false);// 父控件可以拦截事件
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}