寫一個類,繼承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);
}
}
}
}