Android滑动冲突解决方法

来源:互联网 发布:电子技术仿真软件 编辑:程序博客网 时间:2024/06/06 02:21

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()。

原创粉丝点击