在Android系统中,绘图是应用场景最为广泛的领域之一。在进行Android绘图程序时,开发者必须要定义各个绘图元素,如画布、画笔等,并通过SurfaceView来实现绘图。其中,SurfaceView的surfaceCreated方法是非常关键的方法,如果正确使用,可以有效地提高绘图性能。本文将详细介绍如何正确使用Android中的surfaceCreated方法,从而提高绘图性能。
一、surfaceCreated方法的作用和调用时机
SurfaceView是Android中一个用于绘制复杂动态图像的组件,与View不同之处在于它可以在一个独立的线程中进行绘制操作,这个线程被称之为SurfaceView的“绘制线程”。而surfaceCreated方法则是在SurfaceView的“绘制线程”创建完成后被调用的,其作用是在SurfaceView的Surface被创建时执行一些初始化操作,此时绘制线程被开启,可以进行绘制操作。
具体来说,就是在SurfaceView的创建、重建、重新绘制时,系统会调用surfaceCreated方法,其调用时机一般为SurfaceView布局、可见状态变化或宽高变化等情况下。
二、正确使用surfaceCreated方法
1.在surfaceCreated方法中进行数据初始化
由于surfaceCreated方法是在SurfaceView的“绘制线程”启动时执行的,因此一些与绘制相关的数据初始化可以在此处进行,以减少后续的操作时间。
例如,可以在surfaceCreated方法中先定义好一些绘制时必要的对象和变量,如Canvas、Paint、Bitmap等,并进行相关的属性设置。
2.确定画布的大小
确定画布大小是绘图的一个重要步骤,而在SurfaceView中,我们要等待其“绘制线程”启动后才能获取SurfaceView的宽高信息。因此,在surfaceCreated方法中,我们可以通过SurfaceHolder的getSurface方法获取SurfaceView的Surface对象,并通过它的getWidth和getHeight方法来确定画布的大小,进而进行后续的绘制操作。
3.开启或关闭硬件加速
Android系统自带硬件加速功能,它可以加速一些涉及到绘制操作的视图性能,但有时也会影响到某些绘图操作。因此,在SurfaceView的surfaceCreated方法中,我们可以通过Canvas的setHardwareAccelerated方法对硬件加速进行开启和关闭。
开启硬件加速的代码片段如下:
public void surfaceCreated(SurfaceHolder holder) {
// 获取Canvas对象
Canvas canvas = holder.lockCanvas();
// 开启硬件加速
canvas.setHardwareAccelerated(true);
// 释放Canvas对象
holder.unlockCanvasAndPost(canvas);
}
关闭硬件加速的代码片段如下:
public void surfaceDestroyed(SurfaceHolder holder) {
// 获取Canvas对象
Canvas canvas = holder.lockCanvas();
// 关闭硬件加速
canvas.setHardwareAccelerated(false);
// 释放Canvas对象
holder.unlockCanvasAndPost(canvas);
}
4.及时释放绘图资源
在SurfaceView中,我们需要在activity或者layout销毁时调用surfaceDestroyed方法来释放绘制资源,否则可能会引发内存泄漏。
例如,在surfaceDestroyed方法中限制绘制线程可以访问的变量,并将画布对象进行释放和清空:
public void surfaceDestroyed(SurfaceHolder holder) {
// 限制线程访问变量
synchronized (mSurfaceHolder) {
mBitmap = null;
mCanvas = null;
}
}
5.避免在surfaceCreated方法中进行大量的计算
surfaceCreated方法是绘制线程启动时的初始化方法,如果在这个方法中进行大量的计算,那么就有可能延长绘制线程的启动时间,从而降低了绘图的性能。
因此,我们应该将计算操作放在其他方法中,例如surfaceChanged或者onDraw等方法中。
三、总结
Android系统中,surfaceCreated方法在绘制方面有着非常重要的作用,可以帮助我们在SurfaceView的“绘制线程”启动时进行数据初始化、画布大小的确定、硬件加速的开启和关闭等操作。而正确使用surfaceCreated方法,则可以提高Android系统中绘图的性能,从而更好地完成我们的绘制任务。