Android ViewPager的嵌套使用

来源:互联网 发布:淘宝原图制作软件 编辑:程序博客网 时间:2024/06/04 19:34


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);}// 事件分发@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}/** * 事件拦截  *  * 返回false, 表示不拦截触摸事件,让子控件有机会响应事件, 用于ViewPager嵌套ViewPager时使用 */@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return false;}/** * 拦截所有的触摸事件, 不做任何处理 */@Overridepublic 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. 当上下划动时, * 需要父控件拦截 */@Overridepublic 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);}}


0 0
原创粉丝点击