Android UI架构概述(Activity,surfaceFlinger,windows)
Android应用程序UI框架
WindowManagerService
SurfaceFlinger
Android多屏支持
基本概念和元素
表面(Surface) | Surface就是指向显存的一个物体,用来被绘制到屏幕上,所有你能看见的Window都拥有可以在上面绘制的Surface. 在安卓中,系统使用Surface Flinger服务来把Surface按照正确的深度信息渲染到最终的屏幕上. Surface通常在back buffer中进行渲染,完成之后与front buffer交换,这样显示到屏幕上,以实现流畅显示的效果. |
窗口(Window): | 一个application通过Windows Manager来创建窗口,Windows Manager为每一个窗口(windows)创建Surface来让application在上面绘制各种物体 |
视图(View): | 视图就窗口里的UI元素.一个窗口只拥有一个View Hierarchy,这些View Hierarchy提供了窗口里的所有表现。 当一个窗口需要重新绘制时(比如一个View invalidate自己),锁定Surface,并返回一个Canvas用来在上面绘制,在view hierarchy树向下传递Canvas,来绘制每个view. 这一切都完成后,Surface被解锁,并通过Surface Flinger交换前后Buffer来显示到屏幕上。 |
Canvas: | Canvas是Surface绘图时返回的一个接口,并提供一些绘图api,用来进行实际的绘图操作。目前Canvas可以绘制在bitmap或者openGL container上。 |
SurfaceView: | 它是View的一个特殊子类,它拥有专有的Surface,使application可以直接在上面绘制(普通的view hierarchy必须共享窗口唯一的surface)。 原理是surfaceview请求Window Manager创建一个新窗口,并改变窗口之间的深度信息来显示。 如果SurfaceView的Window显示在主窗口的后面,surfaceview将主窗口相应的位置设置成透明来使可见。 |
总结一下: 一个activity拥有一个Windows Manager-->多个windows-->一个Window只有一个Surface&View hierarchy来绘制==SurfaceView实质上是创建了一个新的窗口,所以拥有自己独立的Surface,可以直接绘制在上面-->在view hierarchy树向下传递Canvas,来绘制每个view-->Surface Flinger交换前后Buffer来显示到屏幕上.
窗口管理框架
窗口(Window)的结构
ViewRootImpl是一个虚拟根View,用来控制窗口的渲染,以及用来与WindowManagerService、SurfaceFlinger通信 DecorView是窗口的真正根View ContentView描述窗口的主题风格
下面3个图可以合成一个图
Window的虚拟根View -- ViewRootImpl
窗口绘图表面 -- Surface 窗口视图 -- View
Android应用程序UI的绘制过程
软件渲染过程 硬件渲染过程
WindowManagerService
职责 计算窗口大小 计算窗口Z轴位置 管理输入法窗口 管理壁纸窗口 执行窗口切换
屏幕的基本结构 计算窗口大小 – Visible Region 计算窗口大小 – Content Region
(图5.6可以合并成一张图)
执行窗口切换 – Starting Window (Activity=window; AWS调用WMS)
参考《老罗的android之旅》
转载:https://blog.csdn.net/fdsafwagdagadg6576/article/details/116355527