普通的Android控件,例如TextView、Button和CheckBox等,它们都是将自己的UI绘制在宿主窗口的绘图表面之上,这意味着它们的UI是在应用程序的主线程中进行绘制的。由于应用程序的主线程除了要绘制UI之外,还需要及时地响应用户输入,否则的话,系统就会认为应用程序没有响应了,因此就会弹出一个ANR对话框出来。对于一些游戏画面,或者摄像头预览、视频播放来说,它们的UI都比较复杂,而且要求能够进行高效的绘制,因此,它们的UI就不适合在应用程序的主线程中进行绘制。这时候就必须要给那些需要复杂而高效UI的视图生成一个独立的绘图表面,以及使用一个独立的线程来绘制这些视图的UI。
一个SurfaceView就是一个被特殊实现的View,除具备一个View的普遍属性外,它拥有自己专门的一个surface,以便让应用直接在里面绘制内容。该SurfaceView是独立于其所属window(记为MainWindow)的view hierarchy,view hierarchy中的view们共享MainWindow那一个surface。SurfaceView 的工作原理比你想的要简单——SurfaceView所做的全部就是要求Window Manager创建一个window,并告诉Window Manager所创建的window的Z轴顺序(Z-order),这个Z轴顺序可以帮助Window Manager决定将新建的window置于MainWindow的上面还是下面。然后,Window Manager会将新建的window定位到SurfaceView在MainWindow中占用的位置。如果新建window在MainWindow后面,SurfaceView会将它在MainWindow中占据的部分变透明,以便让该window显示出来。
网友评论