标签:
可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。
它的特性是:可以在子线程向屏幕上绘图。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。
继承SurfaceView实现SurfaceView.Callback接口,实现接口中方法管理Surface生命周期。
SurfaceView.getHolder()获得SurfaceHolder对象,是Surface的控制器。
SurfaceHolder.addCallback(callback)添加回调接口。
SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
Canvas绘图,在这里进行一系列绘图操作,被缓冲到Surface。
SurfaceHolder.unlockCanvasAndPost(canvas)结束锁定并提交,显示图像。
1 import android.content.Context;
2 import android.graphics.Canvas;
3 import android.graphics.Paint;
4 import android.util.AttributeSet;
5 import android.view.SurfaceHolder;
6 import android.view.SurfaceView;
7
8 public abstract class SimpleSurfaceView extends SurfaceView implements
9 SurfaceHolder.Callback, Runnable {
10
11 private Canvas canvas;
12 private SurfaceHolder holder;// Surface的控制器
13 private boolean isRun;
14 protected long sleepTime = 500;// 刷帧频率,睡眠毫秒数
15 private Paint paint;
16
17 /**
18 * 构造方法
19 */
20 public SimpleSurfaceView(Context context) {
21 super(context);
22 this.holder = getHolder();// 获取SurfaceHolder对象
23 holder.addCallback(this);// 给这个SurfaceHolder添加Surface生命周期回调
24
25 paint = new Paint();//创建画笔对象
26 paint.setAntiAlias(true);//设置画笔抗锯齿
27 }
28
29 /**
30 * 构造方法,以xml方式构建界面是必须有。
31 */
32 public SimpleSurfaceView(Context context, AttributeSet attrs) {
33 super(context, attrs);
34 this.holder = getHolder();// 获取SurfaceHolder对象
35 holder.addCallback(this);// 给这个SurfaceHolder添加Surface生命周期回调
36
37 paint = new Paint();//创建画笔对象
38 paint.setAntiAlias(true);//设置画笔抗锯齿
39 }
40
41 /**
42 * 来自Callback接口, Surface生命周期方法,创建时调用
43 */
44 @Override
45 public void surfaceCreated(SurfaceHolder surfaceHolder) {
46 isRun = true;
47 new Thread(this).start();
48 }
49
50 /**
51 * 来自Callback接口, Surface生命周期方法,改变时调用
52 */
53 @Override
54 public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2,
55 int i3) {
56
57 }
58
59 /**
60 * 来自Callback接口, Surface生命周期方法,销毁时调用
61 */
62 @Override
63 public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
64 isRun = false;
65 }
66
67 /**
68 * 来自Runnable接口
69 */
70 @Override
71 public void run() {
72 while (isRun) {
73 try {
74 canvas = holder.lockCanvas();//锁定画布
75 simpleDraw(canvas, paint);// 子类重写此方法绘图
76 } catch (Exception e) {
77 e.printStackTrace();
78 } finally {
79 if (canvas != null)
80 holder.unlockCanvasAndPost(canvas);//解锁画布
81 }
82
83 // 睡眠片刻,降低刷帧频率
84 try {
85 Thread.sleep(sleepTime);
86 } catch (InterruptedException e) {
87 e.printStackTrace();
88 }
89 }
90 }
91
92 protected abstract void simpleDraw(Canvas canvas, Paint paint);// 绘图,由子类具体实现
93 }
标签:
原文地址:http://www.cnblogs.com/GengZhonghua/p/3870933.html