Touch 事件类型

ACTION_DOWN:按下
ACTION_MOVE:移动
ACTION_UP:松开

一个事件序列以 ACTION_DOWN 开始,中间含有数个 ACTION_MOVE,最后以 ACTION_UP 结束;

分发的三个阶段(对应的三个主要方法)

public boolean dispatchTouchEvent(MotionEvent ev)

派遣点击事件:
事件传递到 ViewGroup / View 时调用;
返回结果表示事件最终是否被消耗;

public boolean onInterceptTouchEvent(MotionEvent ev)

拦截点击事件:
dispatchTouchEvent 中调用;
返回结果表示当前 ViewGroup / View 是否拦截事件;

public boolean onTouchEvent(MotionEvent ev)

处理点击事件:
dispatchTouchEvent 中调用;
返回结果表示当前 ViewGroup / View 是否消耗事件;

三者关系可以用以下伪代码表示:

public boolean dispatchTouchEvent(MotionEvent ev) {    boolean consume = false;    if (onInterceptTouchEvent(ev)) {        // 不一定是 onTouchEvent(ev)        // 参考下面处理事件的三个方法        consume = onTouchEvent(ev);    } else {        consume = child.dispatchTouchEvent(ev);    }    return consume;}

处理事件的三个方法

public boolean onTouch(View v, MotionEvent ev)
public boolean onTouchEvent(MotionEvent ev)
public void onClick(View v)

三者关系可以用以下伪代码表示:

consume = false;if (onTouchListener != null) {    consume = onTouch(v, ev);}if (!consume) {    if (ev.equals(ACTION_UP) && onClickListener != null) {        onClick(v);    }    consume = onTouchEvent(ev);}

简称说明

DTE:dispatchTouchEvent
OITE:onInterceptTouchEvent
OT:onTouch
OTE:onTouchEvent
OC:onClick

Touch 事件分发过程

  1. 事件的传递过程:Activity -> Window -> DecorView -> 顶级 View -> 子 View -> ….(顶级 View 即 setContentView 设置的 View,一般为 ViewGroup;DecorView 即顶级 View 的父 View);
  2. ViewGroup 默认不拦截事件,因此事件一直传递到 View:
    a. 如果当前事件为 ACTION_DOWN,该 View 消耗了事件,则这个事件序列后续的事件都由该 View 来处理(即它的 OITE 不会再被调用);
    b. 如果当前事件为 ACTION_DOWN,该 View 不消耗事件,则这个事件一层层地往上传递,直到事件被消耗为止(且之后的事件都由该 ViewGroup 处理,参考 a);如果所有的 ViewGroup 都不能消耗,则这个事件交给 Activity 处理;
    c. 如果当前事件为 ACTION_MOVE 或 ACTION_UP,该 View 不消耗事件,则该事件会消失,最终交给 Activity 处理,且当前 View 可以持续收到这个事件序列后续的事件;
  3. 如果 ViewGroup 没有子元素,则由该 ViewGroup 处理当前事件(参考2.b)。

更多相关文章

  1. Android(安卓)中文API (91) —— GestureDetector
  2. Android(安卓)onTouchEvent, onClick及onLongClick的调用机制
  3. 隐藏底部导航栏的虚拟按键,并响应点击事件。解决:点击的时候会唤起
  4. Android中onTouch与onClick事件的关系
  5. 从零开始学android:Android事件处理—单选钮与OnCheckedChangeLi
  6. Android的NestedScroll机制
  7. Android(安卓)touch 事件的处理流程
  8. android,自定义广播,最终广播接收者,防止拦截广播,有序广播,无序广
  9. Android(安卓)sendevent/getevent 用法

随机推荐

  1. Android学习日记----------Android 10调
  2. Android高手进阶教程(二十二)之Android中
  3. Android:单元测试Junit的配置
  4. Android开发者已经度过了初级、中级,如何
  5. [置顶] 修改Android开机画面之rle制作
  6. [置顶] Android(安卓)去掉两个textview的
  7. Android多点触摸的实现 (转)
  8. Android(安卓)7.0增加jack跟jill编译器(转
  9. Android使用xutils3框架实现应用程序内的
  10. Banana Pi M64 Android修改分辨率为480x1