https://blog.csdn.net/luoshengyang/article/details/8636153
1 绘制材料的准备
画布(绘制过程) + 输入(接受用户交互)
Activity窗口的组成是:PhoneWindow对象,一个DecorView对象,以及一个ViewRoot对象;
- PhoneWindow对象用来描述窗口对象,本身也是一个View
- DecorView对象用来描述窗口的顶层视图(装填子View)
-
ViewRoot对象除了用来与WindowManagerService服务通信之外,还用来接收用户输入。
2 TextView的绘制过程
- 测量(Measure): 告诉父视图自己的所占据的空间的大小
- 布局(Layout): 控件的位置
- 绘制(Draw):
Java层的Canvas实际上是封装了C++层的SkCanvas。C++层的SkCanvas内部有一块图形缓冲区,这块图形缓冲区就是窗口的绘图表面(Surface)里面的那块图形缓冲区。
窗口的绘图表面里面的那块图形缓冲区实际上是一块匿名共享内存,它是SurfaceFlinger服务负责创建的。
http://blog.csdn.net/luoshengyang/article/details/7846923
SurfaceFlinger服务创建完成这块匿名共享内存之后,就会将其返回给窗口所运行在的进程。窗口所运行在的进程获得了这块匿名共享内存之后,就会映射到自己的进程空间来,因此,窗口的控件就可以在本进程内访问这块匿名共享内存了,实际上就是往这块匿名共享内存填入UI数据。注意,这个过程执行完成之后,控件的UI还没有反映到屏幕上来,因为这时候将控件的UI数据填入到图形缓冲区而已。
http://blog.csdn.net/luoshengyang/article/details/8462738
窗口的UI的显示是WindowManagerService服务来控制的。因此,当窗口的所有控件都绘制完成自己的UI之后,窗口就会向WindowManagerService服务发送一个Binder进程间程通信请求。WindowManagerService服务接收到这个Binder进程间程通信请求之后,就会请求SurfaceFlinger服务刷新相应的窗口的UI。
3 TextView的获取键盘输入过程
http://blog.csdn.net/luoshengyang/article/details/6882903
每一个窗口的创建的时候,都会与系统的输入管理器建立一个用户输入接收通道。输入管理器在启动两个线程,其中一个用来监控用户输入,即监控用户是否按下或者放开了键盘按键,或者是否触摸了屏幕,另外一个用来将监控到的用户输入事件分发给当前激活的窗口来处理,而这个分发过程就是通过前面建立的通道来进行的.
ViewRoot类的成员函数deliverKeyEvent负责分发键盘输入事件,而ViewRoot类的成员函数deliverPointerEvent负责分发触摸屏输入事件