美文网首页
android 事件分发机制学习

android 事件分发机制学习

作者: 有点健忘 | 来源:发表于2018-03-06 16:44 被阅读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

    相关文章

      网友评论

          本文标题:android 事件分发机制学习

          本文链接:https://www.haomeiwen.com/subject/sfxcxftx.html