首页 > 代码库 > 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简单框架