Android应用之Android Touch 事件分发机制
白羽 2018-06-01 来源 :网络 阅读 1492 评论 0

摘要:本文将带你了解Android应用中Android Touch 事件分发机制,希望本文对大家学Android有所帮助。




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)

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

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

   

简称说明

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

Touch 事件分发过程

事件的传递过程:Activity -> Window -> DecorView -> 顶级 View -> 子 View -> ….(顶级 View 即 setContentView 设置的 View,一般为 ViewGroup;DecorView 即顶级 View 的父 View); ViewGroup 默认不拦截事件,因此事件一直传递到 View:


a. 如果当前事件为 ACTION_DOWN,该 View 消耗了事件,则这个事件序列后续的事件都由该 View 来处理,且它的 OITE 不会再被调用;


b. 如果当前事件为 ACTION_DOWN,该 View 不消耗事件,则这个事件一层层地往上传递,直到事件被消耗为止(且之后的事件都由该 ViewGroup 处理,参考 a);如果所有的 ViewGroup 都不能消耗,则这个事件交给 Activity 处理;


c. 如果当前事件为 ACTION_MOVE 或 ACTION_UP,该 View 不消耗事件,则该事件会消失,最终交给 Activity 处理,且当前 View 可以持续收到这个事件序列后续的事件; 如果 ViewGroup 没有子元素,则由该 ViewGroup 处理当前事件。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved