Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系相关的知识,希望对你有一定的参考价值。

1

/**
 * 整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 
 * ----> SurfaceView.getHolder()获得SurfaceHolder对象 
 * ---->SurfaceHolder.addCallback(callback)添加回调函数
 * ---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
 * ----> Canvas绘画
 *  ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
 *  
 *  
3、SurfaceHolder
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。
处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
 */
public class BitmapView extends SurfaceView implements Callback{

    private SurfaceHolder holder;
    private MyRunnable runnable = null;
    
    /**
    在线程中执行绘制的操作
   */
public class MyRunnable implements Runnable{ private SurfaceHolder myholder; public boolean isRun; public MyRunnable (SurfaceHolder myholder){ this.myholder = myholder; } public void run() { int count = 0; while(isRun){ Canvas c = null; try { synchronized (myholder) { c = myholder.lockCanvas();//锁定画布, 获取画布对象,进行画图等操作, c.drawColor(Color.BLACK); Paint paint = new Paint();//创建画笔 paint.setColor(Color.RED);//设置画笔颜色 Rect r = new Rect(100, 50, 150, 300); c.drawRect(r, paint); c.drawText( "这是第"+(count++)+"秒", 100, 310, paint); Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); }finally { if (c != null){ holder.unlockCanvasAndPost(c);//结束画图,提交改变 } } } }; }; public BitmapView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public BitmapView(Context context, AttributeSet attrs) { super(context, attrs); } public BitmapView(Context context) { super(context); holder = this.getHolder();//获取SurfaceHolder对象 holder.addCallback(this);//添加回调函数 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 在surface的大小发生改变时激发 } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO 在创建时激发,一般在这里调用画图的线程。 runnable = new MyRunnable(holder); runnable.isRun = true; new Thread(runnable).start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO 销毁时激发,一般在这里将画图的线程停止、释放。 runnable.isRun = false; } }

 

2

以上是关于Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系的主要内容,如果未能解决你的问题,请参考以下文章

Android 进阶——图形显示系统之底层图像显示原理小结

Android 进阶——图形显示系统之底层图像显示原理小结

Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系

Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系

Android图形显示之硬件抽象层Gralloc

Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制