写一个类,继承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);
}
}
}
}