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
- ViewPager子类与父类滑动冲突的情况
- ListView与ViewPager的滑动冲突
- SlidingPanelLayout与ViewPager滑动冲突的解决方法
- ViewPager与百度地图的滑动冲突
- webview与viewpager的滑动冲突问题
- ViewPager与Item滑动冲突的bug
- MPAndroidChart与ViewPager的滑动冲突处理
- SwipRefreshView与ViewPager滑动冲突
- TabHost与ViewPager滑动冲突
- SwipeRefreshLayout与viewpager的滑动冲突的解决
- SwipeRefreshLayout与viewpager的滑动冲突的解决
- 解决viewpager与gridview之间的滑动冲突
- Android中ViewPager与HorizontalListView的滑动冲突处理
- 如何解决DrawerLayout与Viewpager的滑动冲突
- ViewPager与ListView纵向滑动冲突的问题
- 解决SlidingMenu与ViewPager的滑动冲突尝试
- ViewPager与SwipeFreshLayout(下拉刷新)滑动冲突的解决
- Android Viewpager与WebView轮播滑动冲突的解决方案
- 汇编-vcIO.inc
- leetcode-Single Number
- 设计模式:状态模式(State)
- D The Lucky Week
- 浅析C#深拷贝与浅拷贝
- ViewPager子类与父类滑动冲突的情况
- 有趣的linux文件bb
- Aandroid 标题显示进度条遇到的问题总结
- (4.2.26)一个特别适合新手练习的Android小项目——每日一妹纸
- Android 状态栏的动态显示和隐藏
- Java并发编程:线程池的使用
- 模板匹配BLOCK MATCHING
- Unity AssetBundle打包与资源更新
- LeetCode------Delete Node in a Linked List