您的位置:首页 > 其它

SurfaceView的操作类

2015-11-16 15:08 239 查看
写一个类,继承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);
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: