Android 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);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值