学习android内核 --View工作原理相关

来源:互联网 发布:搜图片出处软件 编辑:程序博客网 时间:2024/04/29 02:38

View系统定义了从用户输入消息到消息处理的全过程。


消息处理过程:(按键消息KeyEvent、点消息Pointer、轨迹球消息Trackball)

1.用户触摸屏幕的消息或键盘消息等输入设置产生消息-〉转换成系统统一处理的消息值 -> 再分发到各窗口系统(由WmS判断用户正在与哪个窗口交互)。


2.因为窗口都是由WmS创建的,所以其知所有窗口的信息,比如大小,位置等。


3.如果是按键消息:则直接发送给当前窗口。


4.如果是触摸消息:WmS则会根据消息的位置坐标去匹配所有的窗口,坐标落在哪个窗口区域中,就把消息发送给该对应窗口。


5.消息到达处理窗口,如何处理则是该窗口内部自己的事。系统一般提供了一些方法或一些特定的回调函数重载,达到自定义消息处理的目的。(这里体现了一个概念就是感觉是操作系统在调用我们,而不是我们在调用操作系统,这样的架构有利于应用开发)。


View系统获取消息后:

会按照默认的逻辑来派发消息,主要就是把该消息派发给所有的子视图(View),以便相应的子视图能够获得消息并执行不同的任务。


1.后台任务(界面没有刷新变化):那么该View系统接下来仅按照默认逻辑继续派发下一个用户消息;


2.界面有刷新变化的:则需要重绘;


重绘:

重绘需要三大步骤:

1.计算该窗口的所有视图的大小,即measure过程。(一个视图中界面变化是否重新计算大小,要根据在View中的一个变量判断决定(一般改变了界面后会设置该变量))

2.为所有视图分配位置,即layout过程。

3.将视图绘制到屏幕上。(在绘制的时候,系统内部为每一个窗口创建了一个Canvas对象,并把这个Canvas对象传递给从根视图到所有子视图。View系统将Canvas传递给子视图时,都先将画布进行一次裁剪,从而在子视图看来,总是从画布的(0,0)位置开始绘制的)。


--------------------------------------------


按键消息总体派发过程:

1.如果窗口存在输入法,则先把按键消息派发给输入法窗口处理,不过在此之前如果程序员可以重载diapatchKeyEventPreIme()函数来截获一些特别的按键消息。

2.输入法如果没有消耗该消息,则消息进入View树进行处理。

3.处理完所有消息后,如果WmS要求发送执行完毕回执,则调用finishInputEvent()报告给WmS已经处理的消息,从而使得WmS可以继续派发下一个消息。


根视图内部派发流程:

系统调用mView.dispatchKeyEvent()将消息派发到根视图,这个根视图要么是

      1.PhoneWindow.DecorView: 如 Activity窗口

      2.普通的ViewGroup: 如 状态栏窗口



原创粉丝点击