ViewPager中怎样让子类也可以滑动(父类不抢子类的滑动事件)?
1、相关的概念方法
android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。
2、处理事件
//事件分发表示是否拦截,返回false表示不拦截,可以让嵌套在内部的viewPager相应的滑动。在父viewPager中是这个方法
public boolean onInterceptTouchEvent(MotionEvent arg0){
return false;
}
或者
//事件分发,请求父控件及祖宗控件不要拦截事件
//在子viewPager中是这个方法
public boolean dispatchTouchEvent(MotionEvent ev){
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
更详细的代码
父ViewPager
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 不能左右划的ViewPager
*
* @author Kevin
*
*/
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
// 表示事件是否拦截, 返回false表示不拦截, 可以让嵌套在内部的viewpager相应左右划的事件
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return false;
}
/**
* 重写onTouchEvent事件,什么都不用做
*/
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return false;
}
}
子类ViewPager
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 11个子页签水平滑动的Viewpager, 暂时不用
*
* @author Kevin
*
*/
public class HorizontalViewPager extends ViewPager {
public HorizontalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HorizontalViewPager(Context context) {
super(context);
}
/**
* 事件分发, 请求父控件及祖宗控件是否拦截事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//进行判断,有的需要父控件拦截有的不需要父控件拦截
if (getCurrentItem() != 0) {
getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,
// 不拦截
} else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截
getParent().requestDisallowInterceptTouchEvent(false);// 拦截
}
return super.dispatchTouchEvent(ev);
}
}
总结 : 目前只要知道怎样拦截或者不拦截ViewPager中的事件就好了,太深入研究不能马上领会,需要在平时的开发中去实践体会。上面的代码的关键点就是在拦截事件上做了文章 onInterceptTouchEvent,而disPatchTouchEvent是默认false,标识这个控件内部的事件可以继续向下分发
参考链接 http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html