android 事件分发与滑动冲突

来源:互联网 发布:经传指标公式源码 编辑:程序博客网 时间:2024/06/06 14:29

/**
* 当事件发生之后,其传递的顺序是Activity–>Window–>DecorView–>viewGroup
* 随后,根ViewGroup会接收到事件的传递.
*
* 1 ViewTree的分发:
* 将整个的视图看成是一个视图树,当有一个事件产生的时候,
* ViewGroup会分发事件,调用dispatchTouchEvent事件,
* 方法存在boolean返回值,当返回true时表示次控件要消耗事件,
* 事件停止向下分发.
*
* 2 事件序列的分发,首先分发Down事件,当存在控件要消耗该事件时,
* ViewTree会记录该控件,并将剩下的事件序列都交给它处理.
*
* 3 对于ViewGroup而言,其首先会调用 dispatchTouchEvent 方法来分发事件
* 在其内部,会调用onInterceptTouchEvent 方法拦截事件.
* 当拦截方法返回true,表示拦截,那么事件就会交给onTouchEvent 方法
* 当拦截方法返回false,事件就会交给子控件处理
*
* 4 对于控件而言,如果设置了setOnTouchListener监听器,其会调用
* onTouch 方法,如果 方法返回true,则控件的onTouchEvent 不会被调用
* 否则就会调用onTouchEvent方法,来处理点击事件,要设置控件的onTouch事件,控件的属性必须是enable.
*
*
* 对于一个控件而言,一旦 它决定拦截,那么事件序列都由它来处理,并且拦截事件不会再调用
* 对于一个控件而言,如果它不消耗action_down事件,那么其他的事件都会交给它父类处理
* 当ViewGroup中的子控件都不处理事件时,会调用ViewGroup的ontouch
* 事件,默认调用super.dispatchTouchEvent交给Activity处理
*/

解决滑动冲突的伪代码:

    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        boolean intercepted=false;        int x=(int) ev.getX();        int y=(int) ev.getY();        switch(ev.getAction()){        case MotionEvent.ACTION_DOWN:            intercepted=false;            break;        case MotionEvent.ACTION_MOVE:            if(父类需要当前点击事件){                intercepted=true;            }else{                intercepted=false;            }            break;        case MotionEvent.ACTION_UP:            intercepted=false;            break;        }        return intercepted;    }
0 0
原创粉丝点击