Android滑动冲突解决方法

dispatchTouchEvent(ev)伪代码:

	public boolean dispatchTouchEvent(MotionEvent ev) {
		boolean consume = false;
		if (onInterceptTouchEvent(ev)) {
			onTouchEvent(ev);
		} else {
			child.dispatchTouchEvent(ev);
		}
		return consume;
	}

1.外部拦截法

   重写父view的onIntercepTouchEvent():

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercept = false;
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                intercept = false;
                break;
            case MotionEvent.ACTION_MOVE:
                if(父view需要处理事件) {
                    intercept = true;
                } else {
                    intercept = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                intercept = false;
                break;
        }
        return intercept;
    }

 2.内部拦截法

   先重写父view的onInterceptTouchEvent方法。

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        if(action == MotionEvent.ACTION_DOWN) {
            return false;
        } else {
            return true;
        }
    }

   再重写子view的diapatchTouchEvent()


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        ViewParent parent = getParent();
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                parent.requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                if(父view需要处理事件) {
                    parent.requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }


requestDisallowInterceptTouchEvent()的作用时当参数为true的时候,不再执行父view的onInterceptTouchEvent(),当为false的时候会执行父view的onInterceptTouchEvent()。

你可能感兴趣的:(Android)