viewpager嵌套viewpage冲突问题(网易首页广告)

来源:互联网 发布:java erp 开源框架 编辑:程序博客网 时间:2024/05/21 07:50
为了防止广告的viewPager滑动,被外面的viewPager拦截,通过指定父View要不要拦截事件进行处理。所以重写广告的ViewPager,广告滑到最后一页,继续滑动
,则直接滑动,外面的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);    }    public ChildViewPager(Context context) {        super(context);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // 当拦截触摸事件到达此位置的时候,返回true,        // 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent        return true;    }    @Override    public boolean onTouchEvent(MotionEvent arg0) {        int x, y;        // 每次进行onTouch事件都记录当前的按下的坐标        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现在进行的是本控件的操作,不要对我的操作进行干扰            x = (int)(curP.x - downP.x);            y = (int)(curP.y - downP.y);            int count = this.getAdapter().getCount()-1;            if (Math.abs(x) > Math.abs(y)) {                if (x > 0 && getCurrentItem() == 0) {// 第一页向左移动                    getParent().requestDisallowInterceptTouchEvent(false);                } else if (x < 0 && getCurrentItem() == count) {//                     getParent().requestDisallowInterceptTouchEvent(false);                } else {                    getParent().requestDisallowInterceptTouchEvent(true);                }            }else if(Math.abs(x) < Math.abs(y)) {            }        }        if (arg0.getAction() == MotionEvent.ACTION_UP) {            // 在up时判断是否按下和松手的坐标为一个点            // 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick            if (downP.x == curP.x && downP.y == curP.y) {                onSingleTouch();                return true;            }        }        if (arg0.getAction() == MotionEvent.ACTION_CANCEL) {            getParent().requestDisallowInterceptTouchEvent(false);        }        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;    }}
原创粉丝点击