首页 > 代码库 > SurfaceView简单框架
SurfaceView简单框架
- 简介
可以直接从内存或者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 @Override45 public void surfaceCreated(SurfaceHolder surfaceHolder) {46 isRun = true;47 new Thread(this).start();48 }49 50 /**51 * 来自Callback接口, Surface生命周期方法,改变时调用52 */53 @Override54 public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2,55 int i3) {56 57 }58 59 /**60 * 来自Callback接口, Surface生命周期方法,销毁时调用61 */62 @Override63 public void surfaceDestroyed(SurfaceHolder surfaceHolder) {64 isRun = false;65 }66 67 /**68 * 来自Runnable接口69 */70 @Override71 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简单框架
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。