SurfaceView类是一个用于处理Surface的视图,也是Android API提供的另一个类。
什么是Surface?它是一个抽象的原是缓冲区,被屏幕组合器用于渲染特定视图。屏幕组合器是Android上所有渲染的幕后推手,并最终负责将所有的像素点推送到GPU。
我们的目标就是在一个独立的线程中执行渲染,而不用大量占用UI线程,因为UI线程还有很多工作要做。SurfaceView类提供了一种在UI线程之外的线程中进行渲染的方式。
SurfaceHolder和锁定
为了在UI线程之外的另一个不同线程中渲染到SurfaceView,我们需要获得一个SurfaceHolder类的实例,如下所示:
SurfaceHolder holder = surfaceView.getHolder();
SurfaceHolder是Surface的一个包装,可为我们做一些辅助工作。它提供两个方法:
Canvas SurfaceHolder.lockCanvas();
SurfaceHolder.unlockAndPost(Canvas canvas);
第一个方法锁定Surface用于渲染并返回一个可用的Canvas实例。第二个方法解锁Surface并确保通过Canvas进行绘制的内容可显示在屏幕上。我们将在渲染线程中使用这两个方法以获取Canvas,通过它进行渲染并最终确保我们渲染的图像能在屏幕上可见。我们必须确保传递到SurfaceHolder.unlockAndPost()方法的Canvas与从SurfaceHolder.lockCanvas()方法接收的相同。
当SurfaceView被实例化时,Surface并没有立即创建。相反,它是异步创建的。每当活动暂停或再次恢复而重新创建时,该Surface都将被销毁。
Surface的创建与有效性
只要Surface没有生效,我们就不能从SurfaceHolder中获取Canvas。不过,我们可以通过下面的语句来查看Surface是否已被创建:
boolean isCreated = surfaceHolder.getSurface().isValid();
如果该方法返回true,我们就可安全的锁定该Surface并通过接收到的Canvas来在其上进行绘制。我们必须绝对确保在调用SurfaceHolder.lockCanvas()之后再次解锁Surface,否则我们的活动可能会锁定手机。