android的view系统定义了从用户输入消息到消息处理的全过程。
比如,当用户通过触摸屏或者硬键盘等输入设备产生输入消息之后,该消息首先是被消息处理前端处理一下,转换为系统上层统一的消息值。
举个例子,当我们按下返回键时(硬键盘),由于硬件的原因,不同的手机会有不同的值代表返回键,但是上层如何统一处理呢,就是前端处理一下(可能就是我们说的所谓的驱动来处理硬件消息),然后把处理的值发送给后续的消息处理模块,处理后的值就是系统统一的值,就是咱们写应用开发时所有看到的值KeyEvent.KEYCODE_BACK
接下来就是窗口管理系统的事了,窗口管理系统根据所有窗口的换钻头判断用户正在和哪个窗口进行交互,然后才把该消息发送给当前窗口。
如果是按键消息,直接发送给当前窗口,如果是触摸消息,窗口管理系统会根据消息的坐标去匹配所有的窗口,判断这个坐标到底该属于哪个窗口,然后才把消息发送到相应的窗口。
发到相应窗口之后,怎么去处理这个消息那就是窗口自己的事情。
窗口中的view获得消息后,后按照默认的逻辑进行派发消息,主要是消息派发给所有的子视图,以便相应的子视图能够获得消息,并且执行部同的任务。如果引起了界面的变化,则会重绘界面。
重绘界面过程大致上分为三步:
(1)计算该窗口中所有视图的大小,这一步是对view的测量过程,测量所有视图的尺寸大小。
在测量的过程中,所有的view都会分配给一个准确的值,会吧所有的wrap_content,match_parent,fill_parent都转化成准确的值
(2)为所有视图分配位置,这一步成为布局的过程,就是决定视图应该放在屏幕什么位置上。
(3)把视图绘制到屏幕上。
计算完视图大小和位置,就确定了哪个视图该绘制哪个不需要绘制。在绘制的过程中,系统会为每个窗口创建一个画布(Canvas)对象,把画布对象传递给从跟视图到所有的
子视图。view系统将画布对象传递给子视图是,都会先将画布进行一次裁剪,从而子啊子视图看来,自己持有一个独立的画布似的,都是从(0,0)坐标开始绘制,其实是同一个画布。