在Android开发中,SurfaceView是一个非常实用的组件,因为它可以让我们在屏幕上绘制自己的内容而不会影响其他组件的显示。在实际开发中,经常会用到SurfaceView的生命周期方法surfaceCreated,今天我们就来深度解析一下surfaceCreated的作用及用法。
一、surfaceCreated方法是做什么用的?
首先,我们要知道,SurfaceView在屏幕上绘制的所有内容都是在一个Surface上进行的。而surfaceCreated方法就是在这个Surface被创建出来之后被调用的,表示Surface被创建出来了,我们可以开始往上面绘制我们需要的内容。简单来说,surfaceCreated方法就是Surface被创建后我们可以利用它来显示我们的绘制内容。
二、surfaceCreated方法的调用时机
当我们使用SurfaceView显示自己的绘制内容时,很可能会在surfaceCreated方法中出现一些问题,例如画面不显示、闪烁等等。这些问题的出现,很大程度上是由于surfaceCreated方法被调用的时机不同而导致的。下面我们来具体分析一下surfaceCreated方法的调用时机。
1. SurfaceView初次显示
当我们初次在一个Activity中设置SurfaceView并调用它的生命周期方法时,surfaceCreated方法会被立即调用。这时候我们可以在surfaceCreated方法中初始化绘制所需的资源,例如画笔、Bitmap等。
2. 屏幕横竖屏切换
当我们在屏幕横竖屏切换时,Activity会重新创建,同时SurfaceView也会重新创建。这时候surfaceCreated方法会被再次调用,我们就需要在这里重新初始化绘制所需的资源,并重新开始绘制。
3. 程序暂停、恢复
当我们的程序因为一些原因(例如来电等)而暂停时,SurfaceView也被暂停,并且Surface会被销毁。当程序恢复时,Surface会被重新创建,这时候surfaceCreated方法会被调用,我们需要在这里重新初始化绘制需的资源。
4. 后台运行
当后台进程占用过多资源或者其他应用程序时,我们的程序可能会被挂起。此时SurfaceView也会被挂起,Surface也会被销毁。当我们的应用程序重新被启动时,Surface会被重新创建,并且surfaceCreated方法会被调用,我们需要在这里重新初始化绘制所需的资源。
三、具体的应用场景
在实际开发中,我们经常会用到SurfaceView来实现一些动画效果,例如游戏中的角色移动,屏幕的刷新等等。这些效果的实现离不开surfaceCreated方法的调用,下面我们来谈一下具体的应用场景。
1. 开启子线程
为了避免SurfaceView的绘制操作耗费太多的时间造成UI线程卡顿,我们可以在surfaceCreated方法中开启一个子线程来专门用来绘制UI。在这个线程中,我们可以不用担心操作耗时过长的问题,而且还可以启用双缓冲技术来避免画面闪烁等问题。
2. 初始化绘制资源
SurfaceView的绘制离不开一些资源的初始化,例如画笔、Bitmap等。因此,在surfaceCreated方法中我们应该进行一些初始化的操作,以便在之后的绘制中能够更加流畅地进行。
3. 开始绘制
当绘制所需资源被初始化之后,我们就可以开始进行绘制了。在surfaceCreated方法中,我们可以调用SurfaceHolder的lockCanvas方法来获取Canvas对象,然后进行绘制操作。绘制完毕之后,要加锁解锁SurfaceHolder。
四、小结
在Android开发中,SurfaceView是一个非常实用的组件,我们可以利用它来实现一些动画效果,提高应用程序的用户体验。而SurfaceView离不开一个重要的生命周期方法surfaceCreated,它的调用时机决定了整个应用程序的绘制效果。在使用SurfaceView时,我们要注意surfaceCreated方法的调用时机,并且在这个方法中进行一些初始化绘制所需的资源的操作,这样才能确保绘制效果的流畅和稳定。