美文网首页Android自定义View
dispatchTouchEvent事件分发浅析(二)分发

dispatchTouchEvent事件分发浅析(二)分发

作者: dodo_lihao | 来源:发表于2016-08-23 12:27 被阅读325次

    前面我们简单的了解了代码

    具体代码可以见https://github.com/2954722256/demo_event

    这个时候, 我们 打印的设置暂时只是打印 MotionEvent.ACTION_DOWN
    运行项目后, 可以得到结果

    Paste_Image.png

    我们先看下View对应可以Override的方法

    boolean dispatchTouchEvent(MotionEvent ev);
    boolean onTouchEvent(MotionEvent ev);
    

    他们分别是 分发事件 和 触摸事件


    个人理解为:

    现在要做一个面包, 让下面人做
    如果下面人做了,就ok了
    如果下面人没有做,需要告诉dispatch分发这个任务的人
    依次传递

    Paste_Image.png

    (图片来自网上,如果侵占作者权益,联系我删除)

    dispatchTouchEvent 可以理解成 下达做面包的指令
    onTouchEvent 可以理解成 具体做面包


    某个View的点击

    (图中的 a , 是继承 Button)

    Paste_Image.png

    【EventButton】:

    package com.aohuan.test.dodoevent.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.Button;
    
    import com.aohuan.test.dodoevent.tools.TouchEventUtil;
    
    public class EventButton extends Button{
        public EventButton(Context context) {
            super(context);
        }
    
        public EventButton(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public EventButton(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            TouchEventUtil.logActionMsg(getClass(),"onTouchEvent",ev);
            return super.onTouchEvent(ev);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev);
            return super.dispatchTouchEvent(ev);
        }
    }
    

    这里,我们只是在dispatchTouchEvent 和 onTouchEvent 进行了打印

    当我们触摸【a】的时候, 会得到打印

    MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
    EventButton ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
    EventButton ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
    
    Paste_Image.png

    我们可以发现
    先调用了 Activity的 dispatchTouchEvent
    再调用 EventButton 的 dispatchTouchEvent 和 onTouchEvent

    对应View来说, 会从最高的地方,传递到View, 获取到OnTouchEvent 后结束


    我们再来看看ViewGroup的点击

    某个ViewGroup的点击

    (图中的 b , 是继承 LinearLayout)

    Paste_Image.png

    【EventViewGroup】:

    package com.aohuan.test.dodoevent.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    
    import com.aohuan.test.dodoevent.tools.TouchEventUtil;
    
    public class EventViewGroup extends LinearLayout{
        public EventViewGroup(Context context) {
            super(context);
        }
    
        public EventViewGroup(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public EventViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            TouchEventUtil.logActionMsg(getClass(),"onTouchEvent",ev);
            return super.onTouchEvent(ev);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev);
            return super.dispatchTouchEvent(ev);
        }
    
    }
    

    这里,我们也只是在dispatchTouchEvent 和 onTouchEvent 进行了打印

    当我们触摸【b】的时候, 会得到打印

    MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
    EventViewGroup  ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
    EventViewGroup  ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
    MainActivity    ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
    
    Paste_Image.png

    我们可以发现
    先调用了 Activity的 dispatchTouchEvent
    再调用 EventButton 的 dispatchTouchEvent 和 onTouchEvent
    不同的是,会回传调用 Activity的 onTouchEvent

    ** 对应ViewGroup来说, 会从最高的地方,传递到ViewGroup, 获取到OnTouchEvent 后
    ,并不会消费带哦,而是会再次往回调用到最高地方的 OnTouchEvent 才结束
    **


    下一篇我们可以了解dispatchTouchEvent事件分发浅析(三)点击执行顺序

    相关文章

      网友评论

        本文标题:dispatchTouchEvent事件分发浅析(二)分发

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