码迷,mamicode.com
首页 > 其他好文 > 详细

SurfaceView简单框架

时间:2014-07-27 10:59:52      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

  • 简介

可以直接从内存或者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 }

 

SurfaceView简单框架

标签:

原文地址:http://www.cnblogs.com/GengZhonghua/p/3870933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!