SurfaceView的操作類


寫一個類,繼承SurfaceView,在其構造方法中,獲取surfaceHolder,並得到SurfaceView的生命週期。在surfaceCreated方法裏,開啓繪製線程,在surfaceDestory方法裏,關閉線程。在線程裏,每隔50s繪製一次。繪製方法用try  catch方法包起來,因爲可能canvas會報空指針,在進入主屏幕的時候,或者線程沒有停止,但SurfaceView已經關閉的情況下。

下面是代碼

package com.example.roundprogressbar;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements Callback, Runnable {

	private SurfaceHolder mSurfaceHolder;
	private Canvas mcCanvas;
	/**
	 * 繪製線程
	 */
	private Thread mThread;
	/**
	 * 線程是否在執行
	 */
	private boolean isRunning;

	public MySurfaceView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mSurfaceHolder = getHolder();
		mSurfaceHolder.addCallback(this);

		// 可獲得焦點
		setFocusable(true);
		setFocusableInTouchMode(true);

		// 設置屏幕常亮
		setKeepScreenOn(true);

	}

	public MySurfaceView(Context context) {
		this(context, null, 0);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// 在這裏開啓線程
		isRunning = true;
		mThread = new Thread(this);
		mThread.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		isRunning = false;
	}

	@Override
	public void run() {
		while (isRunning) {
			//每隔50ms繪製一次
			long startTime=System.currentTimeMillis();
			draw();
			long endTime=System.currentTimeMillis();
			if(endTime-startTime<50){
				try {
					Thread.sleep(50-(endTime-startTime));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void draw() {
		try {
			mcCanvas = mSurfaceHolder.lockCanvas();

			if (mcCanvas != null) {
				// 在這裏進行繪製操作
			
			
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (mcCanvas != null) {
				mSurfaceHolder.unlockCanvasAndPost(mcCanvas);
			}
		}
	}

}


發佈了102 篇原創文章 · 獲贊 244 · 訪問量 74萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章