赞
踩
概念:View系统定义了从用户输入消息到处理消息的全部过程。【本文是基于Android 2.3.3源码来进行分析】
1、【事件产生】用户通过触摸屏或者键盘等输入设备产生输入消息,该消息首先被消息处理前端进行接收。
2、【事件封装】消息处理前端接收到该消息后进行一个明确的消息转换,比如”按下”、”抬起”消息,并且该消息包含了原始的键盘码值,该值是由硬件系统决定的,不同的硬件系统会产生不同的消息值。之后消息继续传递至消息处理模块。
3、【内容统一映射】消息处理模块需要一个统一的消息值,例如字符值。消息处理前端的作用就是将这些特定的硬件消息转换成操作系统所需要的统一值。
4、【事件分发】WindowManagerSrevice根据所有的窗口状态判断用户正在与哪个窗口进行交互,然后将该消息发送给当前窗口。
4.1、如果是按键消息,则直接发送给当前窗口
4.2、如果是触摸消息,则WindowManagerSrevice会根据消息的位置坐标去匹配所有的窗口,判断该坐标落到了哪个窗口的区域中,然后把该消息发送给相应的窗口。
5、【事件处理】消息达到了目标窗口,该窗口内部是怎样处理的就是根据不同的GUI系统来拟定了。应用程序一般不直接处理该消息,而是重载一些特定的方法或实现一些特定的回调函数。操作系统在调用应用程序,而不是应用程序在调用操作系统。
6、【View系统】View系统获得消息后,会按照默认的逻辑来进行派发消息(Touch消息传递机制),主要就是把该消息派发给所有的子View,以便相应的子View能够获得消息并执行不同任务,如果该任务会引起界面的变化,那么View系统则要重新绘制界面。
1、计算该窗口中所有View的大小——Measure。
注意:并不是所有导致界面重绘的操作都需要重新计算窗口的大小,在View的内部逻辑中,使用了一个内部变量保存相应的状态,当用户的某个操作导致了改变了View大小时,会设置该变量,而View的内部逻辑会根据该变量,决定是否需要重新测量。
2、为所有的View分配位置——Layout。
3、把View绘制到屏幕上——Draw。
在绘制时,系统内部为每个窗口创建了一个Canvas对象,并把这个Canvas对象传递给从ViewRoot到所有的子View。View系统将Canvas传递给子View时,都先将对该Canvas进行一次Clip,从而在子View看来,总是从Canvas的(0,0)开始绘制的。
经过消息处理前端把硬件物理消息转换成Framework内部定义的统一格式后的消息。该消息目前分为三类:
该类定义了消息包含的参数以及获取这些参数的API。
getAction()
getKeyCode()
getRepeat()
该类定义了和触摸相关的消息参数,并提供了一组API让用户来获取这些参数。
getAction():
getEventTime()和getDownTime()
getPressure()
getSize()
getX(int index) 和getY(int index)
对于更多的点触碰,叹气的顺序不同将产生不同的ACTION序列,这些序列的规矩有两个:
弊端:尽管应用程序可以获得多点触控的消息,然而在目前的View系统中(2.3),并未提供多点触控的标准消息处理。
点击下载
1. MessageQueue 中的next()函数内部调用 nativePollOnce() 读取触摸消息。
2. 如果有消息,回调 ViewRoot 内部的 mInputHandler 对象的 dispatchMotion(),该函数仅仅是发起一个 DISPATCH_POINTER 的异步消息。
3. DISPATCH_POINTER消息交付由 deliverPointerEvent() 来进行处理。
4. 执行完 deliverPointerEvent() 后,调用 finishInputEvent() 向消息获取模块发送一个回执,以便其进行下一次消息派发,真正完成回执的代码是由native C++编写的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。