SurfaceView一般应用在需要大量,及时的绘制图像的情境中。如游戏,照相机。
SurfaceView显示的内容实在子线程中进行绘制的,因此避免造成UI现成的阻塞。
- class MySurfaceView extends SurfaceView implements Callback, Runnable {
- private SurfaceHolder mHolder;
- private Canvas mCanvas;
- private Thread t;// 用户绘制的线程
- private boolean isRunning;
- public MySurfaceView(Context context) {
- this(context, null);
- }
- public MySurfaceView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mHolder = getHolder();// holder管理着SurfaceView的生命周期和绘制的Canvas
- mHolder.addCallback(this);
- setFocusable(true);
- setFocusableInTouchMode(true);
- setKeepScreenOn(true);
- }
- @Override
- public void run() {
- // 不断进行绘制
- while (isRunning) {
- draw();
- }
- }
- private void draw() {
- // 当点击home键或者back键的时候,surfaceView会被销毁,而当surfaceview被销毁后,用于绘制的子线程可能还在运行进行绘制,可能会抛些什么异常
- // 所以要进行try
- try {
- mCanvas = mHolder.lockCanvas();
- if (mCanvas != null) {
- if (mCanvas != null) {
- // TODO draw something
- }
- }
- } catch (Exception e) {
- } finally {
- if (mCanvas != null) {
- mHolder.unlockCanvasAndPost(mCanvas);
- }
- }
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- isRunning = true;
- t = new Thread(this);
- t.start();
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- isRunning = false;
- }
- }