第三章 View的事件体系

view的4个属性: top, left, right, bottom. 这4个属性值都是相对于父容器来说的, 因此它是一个相对坐标.
从android3.0开始,为view的左上角额外增加了几个参数, x, y, translationX和translationY. 当view在平移过程中, top和left表示的是原始左上角的位置信息,其值不改变, 改变的是x, y, translationX和translationY这4个参数.

MotionEvent点击事件

MotionEvent对象提供两组方法: getX/getY和getRawX/getRawY. getX/getY返回的是点击事件相对所在view左上角的坐标位置, 而getRawX/getRawY返回的是点击事件相对手机屏幕左上角的绝对坐标位置。

view的事件分发机制

事件分发机制还是比较复杂的, 看了1天多, 没能系统的把知识点总结完善, 那么就对应用开发中涉及到的点进行下总结吧.

事件分发机制,即当一个MotionEvent对象产生以后, 系统需要把这个对象传递给一个具体的view, 这个传递过程就是事件分发过程。分发过程由三个重要的方法来共同完成:
dispatchTouchEvent, onInterceptTouchEvent和onTouchEvent.

用户的一个触屏操作,叫做一个gesture, 产生一系列motionEvent对象,以ACTION_UP的motionEvent对象开始,以ACTION_DOWN的motionEvent对象结束, 中间可能有若干个ACTION_MOVE的motionEvent对象。

ViewGroup默认不拦截任何事件,它的onInterceptTouchEvent()直接返回false.

    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }

onInterceptTouchEvent()定义是在ViewGroup中, view类中没有onInterceptTouchEvent()的定义.

对于view来说:

view接受MotionEvent对象的入口是dispatchTouchEvent(), 负责调用mOnTouchListener.onTouch if it's defined, 如果mOnTouchListener不存在或是mOnTouchListener.onTouch返回的是false, 那么还会再调用onTouchEvent(event)。

对于ViewGroup来说:

ViewGroup接受MotionEvent对象的入口是dispatchTouchEvent(),做2件事,

  1. 首先调用onInterceptTouchEvent(ev),返回true的话,那么在ViewGroup这层做事件处理,不把事件分发到子view中, 调用自己的 onTouchListener.onTouch (if defined) or onTouchEvent() if (onTouchListener or onTouchListener.onTouch return false).
  2. 如果onInterceptTouchEvent(ev)返回false(也就是所有ViewGroup默认的返回值), 做hit test,遍历所有子views, 根据motionEvent的x,y查找对应的子view, 调用子view的dispatchTouchEvent(event).
开发中一个典型的问题是, 自定义view的onTouchEvent(event)返回值应该返回true还是返回false? 返回不同的值会产生什么效果.

对触屏事件的处理是以一个gesture为一个处理单元. 如果在处理ACTION_DOWN时返回true,那么这个gesture后续的motionEvent对象还会传递到当前view的onTouchEvent()处理, 如果在处理某一个motionEvent对象时,onTouchEvent()返回的是false,那么这个gesture后续的motionEvent对象就不会再传递到当前view的onTouchEvent().

结论是:

onTouchEvent()的返回值表示的含义是, 在处理完当前motionEvent对象后,这个gesture后续的一系列的motionEvent对象, 还要不要继续传递到当前view的onTouchEvent()中去处理. 返回true代表的是要, 返回false代表的是不要.
onTouchEvent()的返回值还表示另一层含义, 如果return true,系统对这个motionEvent对象的处理到此就结束了,如果return false,当前view的parent view(也就是一个ViewGroup)的onTouchEvent()会继续处理这个motionEvent对象.
view的onTouchEvent()对一个gesture的处理,是以处理ACTION_DOWN的motionEvent对象为开始点.

两个总结的很好的帖子, 帮助我们能够更清晰的了解事件分发机制。
http://stackoverflow.com/questions/9586032/android-difference-between-onintercepttouchevent-and-dispatchtouchevent
http://balpha.de/2013/07/android-development-what-i-wish-i-had-known-earlier/

摘录:
The default case

Assuming that none of our Views override the default event handling behavior, this is what happens:

The DOWN event is passed to View C's onTouchEvent method. This method returns false, meaning "I don't care about this gesture."
Because of this, the DOWN event is passed to ViewGroup B's onTouchEvent method, which doesn't care about the gesture either and thus returns false as well.
Same thing: Because ViewGroup B didn't care, the event is now passed to ViewGroup A's onTouchEvent, which also returns false.
Because none of the Views cared about the event, they will not receive any events from the rest of this gesture.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容