Android 一次点击动作的分析

来源:互联网 发布:手机信号网络差的原因 编辑:程序博客网 时间:2024/05/30 23:28

Android一次点击动作的分析

android中的事件类型分为按键事件和屏幕触摸事件,

Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 

一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

下面就以一个点击动作为例,来分析一下Android系统的事件传递和处理.


先说明一下,绿色是自定义的控件(TestView),继承自TextView, 红色也是自定义控件(TestLayout),继承自linearLayout,最下面的是Activity的布局文件.
我们将一个点击动作简单的分解为Down事件和Up事件.当点击屏幕的时候,Down事件会先发生,此时会被android系统监听到.


1传递事件

当系统监听到Down事件时,首先是调用事件分发函数.就是dispatchTouchEvent,调用顺序是 

Activity.dispatchTouchEvent()-->TestLayout.dispatchTouchEvent()-->TestView.dispatchTouchEvent().

Down事件从Activity传递到最上面的TestView.也就是说.事件的传递是从下面向上面传递.


2处理事件

当最上面的TestView控件收到这个Down事件的时候,它有两个选择.一个选择是处理这个Down事件,另一个选择当然就是不处理该事件.如果最上面的这个TestView选择处理这个Down事件,那就是说在TestViewonTouchEvent函数的Action_down分支里面返回true,

那就是说现在这个Down事件被TestView控件消耗掉了.之后处于TestView下面的TestLayout和最下面的Activiyt就没机会处理这一次点击所产生的Down事件了.此时Down事件就结束了.如果TestView选择不处理这个Down事件,就是说TestViewonTouchEvent函数的Action_down分支里面返回false,(或者选择默认)ok,这个时候Down事件会继续向下去找TestLayout.同时Down事件也做了一个艰难的决定,之后所有的事件,包括Move事件,Up事件都不会再传递给最上面的TestView控件了.因为你TestView都不甩我Down事件,那我之后的事件也不去找你TestView控件


  现在Down事件来到了TestLayout控件哪里,TestLayout也有两个选择.要么处理.要么不处理.处理了Down事件就不在向下传,不处理那以后其他的事件也没有TestLayout什么事.

最后Down事件就这样从Activitydispatch上来,从最上面开始寻找处理它的地方.找到了就处理完结束.如果从最上面的控件一路下来,都没人处理Down事件,那Down事件最后还是会回到Activity哪里.如果回到Activity这,那Activity肯定会处理,(因为最开始也从Activity这里送出去的, 呵呵)


  ok,Down事件完了,那就该Up事件出场了.Up事件的传递是根据前面Down事件的处理情况来决定的.Up事件只会被传递到Down事件被处理的控件上去.比如说.前面Down事件如果被TestView这个控件处理的话,那Up事件也会被送到TestView这个控件上的.Up事件送到TestView控件之后,TestView也有两个选择,要么处理,要么不处理.如果TestView控件处理了这个Up事件,也就是说TestViewonTouchEvent函数的Action_Up分支里面返回true,那该Up事件就结束了.如果TestView控件不处理这个Up事件,Up事件就只好再向下去找TestLayout控件.那TestLayout控件也有两个选择,以此类推,如果都不处理,那最后就只能右Activity处理了.


这就是Activity系统的一次点击动作所发生的事情.如果我们的自定义控件实现了onTouchEvent()方法.如果想在Action_Up分支中实现有关的逻辑处理,那我们的Action_Down分支就必须返回true,表示我会招待好Down事件,希望Down事件不要生气,将以后的事件(Move Up)也都给我传上来.



0 0