代码比较简单,需要实现SurfaceHolder.Callback接口和Runnable接口,同时继承SurfaceView类,然后直接上代码吧:
package com.wscq.linechart;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class LineChartSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
/** surface持有者 */
private SurfaceHolder mHolder;
/** 当前画布 */
private Canvas mCanvas;
/** 是否开始绘画 */
private boolean mIsDrawing;
public LineChartSurfaceView(Context context) {
this(context, null);
}
public LineChartSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public LineChartSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
// 设置可以获取焦点
setFocusable(true);
// 进入触摸输入模式后,该控件是否还有获得焦点的能力
setFocusableInTouchMode(true);
// 是否保持屏幕常亮
this.setKeepScreenOn(true);
}
private void draw() {
try {
// 获取并锁定画布
mCanvas = mHolder.lockCanvas();
} catch (Exception e) {
} finally {
if (mCanvas != null) {
// 保证每次都将绘制的内容提交到服务器
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public void run() {
// 如果处于绘画状态,那么就开始绘制
while (mIsDrawing) {
draw();
}
}
/**
* 画布创建时候执行的方法
*
* @param holder
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 开始绘画
mIsDrawing = true;
// 启动绘画线程
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止绘画
mIsDrawing = false;
}
}