android 事件拦截

主要思想是自定义被拦截的view,重写dispatchTouchEvent这个方法,在这个方法里写拦截的规则。

例子请看下面的

 

public class InterceptViewPager extends ViewPager {

    private float    downX;
    private float    downY;

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        // 申请父控件不拦截事件
        getParent().requestDisallowInterceptTouchEvent(true);

        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = ev.getX();
            downY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println("movew...........");
            float moveX = ev.getX();
            float moveY = ev.getY();
            // 是否是横向滑动

            float dx = moveX - downX;
            float dy = moveY - downY;
            if (Math.abs(dx) < Math.abs(dy)) {
                // 纵向滑动
                getParent().requestDisallowInterceptTouchEvent(false);// 拦截
            } else {
                // 申请父控件不拦截事件 条件
                // 1. 如果是第一张图片,从左往右滑动 父类拦截我的事件
                if (getCurrentItem() == 0 && dx > 0) {

                    getParent().requestDisallowInterceptTouchEvent(false);// 拦截
                } else if (getCurrentItem() == getAdapter().getCount() - 1
                        && dx < 0) {
                    // 2. 最后一张图片 从右往左滑动 父类拦截我的事件

                    getParent().requestDisallowInterceptTouchEvent(false);// 拦截
                } else {

                    // 3. 不拦截事件
                    getParent().requestDisallowInterceptTouchEvent(true);// 不拦截
                }
            }
            break;
        default:
            break;
        }

        return super.dispatchTouchEvent(ev);
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章