4e6e80e6340b3ae8cd543689c7be450970d64ad2.svn-base 2.81 KB
package com.ivt.android.me.ui.myview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

/**
 * 
 * @author YeMint 2016-5-7 ChildViewPager.java TODO 最后修改人 :无
 */
public class BannerViewPager extends ViewPager {

	private int mTouchSlop;
	private float mPrevX;
	/** 触摸时按下的点 **/
	PointF downP = new PointF();
	/** 触摸时当前的点 **/
	PointF curP = new PointF();

	// OnSingleTouchListener onSingleTouchListener;

	public BannerViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
	}

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

	@SuppressLint("ClickableViewAccessibility")
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		getParent().requestDisallowInterceptTouchEvent(true);
		// 每次进行onTouch事件都记录当前的按下的坐标
		if (getChildCount() <= 1) {
			return super.onTouchEvent(arg0);
		}
		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现在进行的是本控件的操作,不要对我的操作进行干扰

		}

		if (arg0.getAction() == MotionEvent.ACTION_MOVE) {
			// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
			getParent().requestDisallowInterceptTouchEvent(true);
		}

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

				return true;
			}
		}
		// 注意这句不能 return super.onTouchEvent(arg0);
		// 否则触发parent滑动
		return super.onTouchEvent(arg0);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			mPrevX = MotionEvent.obtain(event).getX();
			break;

		case MotionEvent.ACTION_MOVE:
			final float eventX = event.getX();
			float xDiff = Math.abs(eventX - mPrevX);

			if (xDiff > mTouchSlop) {
				return false;
			}
		}

		return super.onInterceptTouchEvent(event);
	}

}