zoukankan      html  css  js  c++  java
  • Android中View的事件分发机制——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处

    介绍

    点击事件的事件分发就是对MotionEvent事件的分发过程。当一个MotionEvent产生了以后,系统须要把这个事件传递给一个详细的View,而这个传递的过程就是分发的过程。

    涉及到的三个方法

    • dispatchTouchEvent:用来进行事件的分发,假设事件可以传递给当前View。那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
    • onInterceptTouchEvent:用来推断是否拦截某个事件,假设当前View拦截了某个事件,那么在同一个事件序列其中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
    • onTouchEvent:在dispatchTouchEvent方法中调用。用来处理点击事件,返回结果表示是否消耗当前事件,假设不消耗,则在同一个事件序列中。当前View无法再次接收到事件。

    三个方法之间的关系

    public boolean dispatchTouchEvent(MotionEvent ev) { 
        boolean consume = false;
        if(onInterceptTouchEvent(ev)) { 
            consume = onTouchEvent(ev);
        } else { 
            consume = child.dispatchTouchEvent(ev); 
        }
        return consume; 
    }

    上面的伪代码非常好的描写叙述了三者之间的关系。假设当前View拦截事件,就交给自己的onTouchEvent去处理,否则就传给子View。直到事件被终于处理。

    事件分发顺序

    当一个点击事件产生后。它的传递步骤例如以下:Activity -> Window -> View。假设View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用。以此类推。终于将由Activity的onTouchEvent处理。

    Activity对事件的分发过程

    Activity -> Window -> DecorView。

    Windows是一个抽象类。可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。
    DecorView就是当前界面的底层容器。即setContentView所设置的View是它的一个子View。

    顶级View对点击事件的分发过程

    ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent

    顶级View一般都是一个ViewGroup。

    拦截事件之后,假设ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。假设onTouchEvent设置了mOnClickListener。则Listener里的onClick会被调用。假设ViewGroup没有拦截则传给子View直到整个事件分发完毕。

    View对点击事件的处理过程

    假设View设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。

    假设onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。


    View没有onInterceptTouchEvent方法,一旦有点击事件传递给他。他就会处理。

    注:上面仅仅是描写叙述了事件分发过程的原理,关于源代码的分析请參考书本的对应章节。

    欢迎转载。转载请注明出处http://blog.csdn.net/l664675249/article/details/50738102

  • 相关阅读:
    springcloud(Feign)三
    Hibernate @TableGenrator表管理主键生成策略
    Hibernate @Entity注解配置说明
    Hibernate @SequenceGenerator的注解介绍
    java StrutsTypeConverter的使用
    structs2 DefaultTypeConverter类型转换说明
    Struts2(XWork)拦截器的功能介绍:
    structs2 防止表单的重复提交token
    Structs ActionProxy深度阅读
    Structs2 request_locale国际化介绍
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7217028.html
Copyright © 2011-2022 走看看