android 事件分发机制学习

2018-03-06  本文已影响2人  有点健忘

这个图不错,借用下
http://blog.csdn.net/H176Nhx7/article/details/79072310

event.png

布局如下:

 <event.TouchEventViewGroup
        android:id="@+id/touchEventViewGroup1"
        android:background="#55ff0000"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

         <event.TouchEventView
             android:id="@+id/touchEventView1"
             android:layout_width="match_parent"
             android:layout_height="150dp"
             android:background="#550000ff" />
</event.TouchEventViewGroup>

Activity代码如下:

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
        return super.dispatchTouchEvent(event);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========onTouchEvent======"+event.getAction());
        return super.onTouchEvent(event);
    }

ViewGroup的代码如下:

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
        return super.dispatchTouchEvent(event);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========onTouchEvent======"+event.getAction());
        return super.onTouchEvent(event);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        System.err.println(tag+"=========onInterceptTouchEvent======"+ev.getAction());
        return super.onInterceptTouchEvent(ev);
    }
    
    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        System.err.println(tag+"=========requestDisallowInterceptTouchEvent======"+disallowIntercept);
        super.requestDisallowInterceptTouchEvent(disallowIntercept);
    }

View的代码如下

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
        return super.dispatchTouchEvent(event);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========onTouchEvent======"+event.getAction());
        return super.onTouchEvent(event);
    }

点击一下,日志如下图


image.png

可以看到,在不做任何处理的时候,actionDown流程是
activity的dispatchTouchEvent-----------------viewGroup的 dispatchTouchEvent>>onInterceptTouchEvent-------------View的
disptchTouchEvent>>onTouchEvent----------ViewGroup的onTouchEvent--------activity的onTouchEvent.
上边为啥强调actionDown。那是因为,如果在actiondown的时候,onTouchEvent没有返回true,那么后续的actionMove,actionCancel,actionUp等事件都不会再传给这个View了。所以我们看日志可以发现,actionMove也就是2和actionUp也就是1,都直接在activity里消费了。

修改下TouchEventViewGroup代码如下,我们消费action_down事件,返回ture。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========onTouchEvent======"+event.getAction());
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            
            return true;
        }
        return super.onTouchEvent(event);
    }

日志:可以看到,TouchEventViewGroup对于后续的action_move和action_up都能接收到了,不过需要说明下onTouchEvent如果某个action返回了true,那么其他地方就不会处理这个事件了。比如TouchEventViewGroup里的ontouchEvent里如果action_down和action_move都返回true,那么activity里就接收不到这两个事件了。


image.png

继续修改代码,把上边的代码放到自定义TouchEventView里

@Override
    public boolean onTouchEvent(MotionEvent event) {
        System.err.println(tag+"=========onTouchEvent======"+event.getAction());
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:   
            return true;
        }
        return super.onTouchEvent(event);
    }

日志如下:结果是和预料的一样,说明理解是对的


image.png
上一篇下一篇

猜你喜欢

热点阅读