Android ViewPager的嵌套使用
2015-09-01 09:56
465 查看
ViewPager的嵌套使用会涉及到事件传递的处理。
不能滑动的ViewPager
头条新闻横向滑动的ViewPager
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); } }
相关文章推荐
- Android应用通用线程
- Android项目开发新版本需要注意的事项
- Attribute is missing the Android namespace prefix错误
- Android混合开发之Activity类与html页面之间的相互跳转之PhoneGap
- Android自定义属性,format详解
- Android手势检测 带你打造支持图片缩放、平移预览(下)
- Android Material Design Library系列教程(一)
- Android 自定义View (一)
- Android SDK的基本内容
- Leo仿【DOTA视频站】项目实践【四】---- 授权获取优酷access_token
- 高仿360手机卫士——Android源码
- 图片随手势运动
- android控件开源项目
- 常用的android开发框架有哪些
- Android的列表布局
- android学习笔记
- android 读取doc docx xsl xslx
- Android fill_parent、wrap_content和match_parent的区别
- Android应用程序的Activity启动过程
- 解读Android之Intents和Intent Filters