首页 > 代码库 > 硅谷新闻5--顶部新闻轮播图事件处理

硅谷新闻5--顶部新闻轮播图事件处理

重写dispatchTouchEvent,并且要在按下的时候 getParent().requestDisallowInterceptTouchEvent(true);

判断滑动方向,在X轴和Y轴滑动的绝对值谁大就是在什么方向滑动

一,竖直方向滑动 getParent().requestDisallowInterceptTouchEvent(false);

二,水平方向滑动

2.1,当滑动到ViewPager的第0个页面,并且是从左到右滑动 getParent().requestDisallowInterceptTouchEvent(false);

2.2,当滑动到ViewPager的最后一个页面,并且是从右到左滑动 getParent().requestDisallowInterceptTouchEvent(false); 2.3,其他 getParent().requestDisallowInterceptTouchEvent(true);

public class HorizontalScrollViewPager extends ViewPager {
    public HorizontalScrollViewPager(Context context) {
        super(context);
    }

    public HorizontalScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 起始坐标
     */
    private float startX;
    private float startY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                //请求父层视图不拦截,当前控件的事件
                getParent().requestDisallowInterceptTouchEvent(true);//都把事件传给当前控件(HorizontalScrollViewPager)
                //1.记录起始坐标
                startX = ev.getX();
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                //2.来到新的坐标
                float endX = ev.getX();
                float endY = ev.getY();
                //3.计算偏移量
                float distanceX = endX - startX;
                float distanceY = endY - startY;
                //4.判断滑动方向
                if(Math.abs(distanceX) > Math.abs(distanceY)){
                    //水平方向滑动
//                    2.1,当滑动到ViewPager的第0个页面,并且是从左到右滑动
//                    getParent().requestDisallowInterceptTouchEvent(false);
                    if(getCurrentItem()==0&&distanceX >0){
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }

//                    2.2,当滑动到ViewPager的最后一个页面,并且是从右到左滑动
//                    getParent().requestDisallowInterceptTouchEvent(false);
                    else if((getCurrentItem()==(getAdapter().getCount()-1))&& distanceX <0){
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
//                    2.3,其他,中间部分
//                    getParent().requestDisallowInterceptTouchEvent(true);
                    else{
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                }else{
                    //竖直方向滑动
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

 

技术分享

 

硅谷新闻5--顶部新闻轮播图事件处理