ViewPager子类与父类滑动冲突的情况

来源:互联网 发布:淘宝点点外卖 编辑:程序博客网 时间:2024/06/14 10:09

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相应左右划的事件@Overridepublic boolean onInterceptTouchEvent(MotionEvent arg0) {return false;}/** * 重写onTouchEvent事件,什么都不用做 */@Overridepublic 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);}/** * 事件分发, 请求父控件及祖宗控件是否拦截事件 */@Overridepublic 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


0 0