`
lipaneyeti
  • 浏览: 6634 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android2.3版本中viewpager嵌套viewpager响应手势

阅读更多
先上代码
public class ChildViewPager extends ViewPager {
	/** 触摸时按下的点 **/
	PointF downP = new PointF();
	/** 触摸时当前的点 **/
	PointF curP = new PointF();
	OnSingleTouchListener onSingleTouchListener;

	public ChildViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public ChildViewPager(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		// 当拦截触摸事件到达此位置的时候,返回true,
		// 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
		return true;
	}

	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		// 每次进行onTouch事件都记录当前的按下的坐标
		float offX, offY;
		curP.x = arg0.getX();
		curP.y = arg0.getY();

		if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
			// 记录按下时候的坐标
			// 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
			downP.x = arg0.getX();
			downP.y = arg0.getY();
			// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
			getParent().requestDisallowInterceptTouchEvent(true);
		}

		if (arg0.getAction() == MotionEvent.ACTION_MOVE) {
			// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
			// 判断是左右滑还是上下滑,如果左右滑动-》通知父类不对自己进行干扰,如果上下滑动进行干扰
			offX = arg0.getX() - downP.x;
			offY = arg0.getY() - downP.y;
			if (Math.abs(offX) > Math.abs(offY)) {// 横向滑动,不对事件进行拦截。
				// 判断此时是否是最后一页如果是最后一页也通知父类对事件拦截

				if (getCurrentItem() == 0) {// 左边或右边,这样就必须设置总共的view的个数
					// 在最左边能从左往右滑动
					if (offX > 0) {// 从左往右
						getParent().requestDisallowInterceptTouchEvent(false);
					}

				} else if (getChildCount() == (getCurrentItem() + 1)) {
					// 在最右边能从右往左滑动
					if (offX < 0) {// 从左往右
						getParent().requestDisallowInterceptTouchEvent(false);
					}
				} else {
					getParent().requestDisallowInterceptTouchEvent(true);
				}

				System.out.println("set true" + getCurrentItem() + "-"
						+ getChildCount() + "");

			} else {
				getParent().requestDisallowInterceptTouchEvent(false);
			}
		}

		if (arg0.getAction() == MotionEvent.ACTION_UP) {
			// 在up时判断是否按下和松手的坐标为一个点
			// 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
			if (downP.x == curP.x && downP.y == curP.y) {
				onSingleTouch();
				return true;
			}
		}

		return super.onTouchEvent(arg0);
	}

	/**
	 * 单击
	 */
	public void onSingleTouch() {
		if (onSingleTouchListener != null) {
			onSingleTouchListener.onSingleTouch();
		}
	}

	/**
	 * 创建点击事件接口
	 * 
	 * @author wanpg
	 * 
	 */
	public interface OnSingleTouchListener {
		public void onSingleTouch();
	}

	public void setOnSingleTouchListener(
			OnSingleTouchListener onSingleTouchListener) {
		this.onSingleTouchListener = onSingleTouchListener;
	}

原来的ChildViewPager是从网上找的,他只解决里层viewpager不被外层viewpager拦截的作用。但在项目中还需要的是滑动到一端继续滑动就要滑动外层的viewpager,此时就要取得viewpager的子view的个数,并判断如果是最右端就内层响应从左向右的手势,把从右向左的手势推给外层,最左端反之。
getChildCount()也可以在viewpager替换成子view的个数,也可以在外面设定:viewPager.setOffscreenPageLimit(4);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics