安卓笔记-SurfaceView的学习(一)理解与使用

    首先什么是SurfaceView?

    官方SDK的API文档介绍很多,这里简单的来讲,它是继承自View类的一个子类,和View一样用于绘图并显示到屏幕上,它比View更好的一点在于它允许主UI线程之外的线程对视图进行操作,并且对SurfaceView的使用通常是通过SurfaceHolder,这个接口类实现的。

    如何实现一个SurfaceView呢?

    1、创建SurfaceView子类并实现Callback接口;

public class LearnSuefaceView extends SurfaceView implements SurfaceHolder.Callback{
        ...
        ...
}

    之所以要实现接口,是因为当一个SurfaceView的控件即将变为可见状态时,系统框架会通过WindowsManger来让SurfaceFlinger来创建一个新的Surface来显示相应的内容,但这个过程并不是同步的,因此必须通过接口来得知Surface是否创建完毕。

    通常我们要实现三个方法:

    surfaceCreated(SurfaceHolder holder);
    surfaceChanged(SurfaceHolder holder, int format, int width, int height);
    surfaceDestroyed(SurfaceHolder holder);

    由名字很容易知道它们的作用。

    对SurfaceView的使用通常是通过SurfaceHolder实现的,因此要在构造函数中获取相应SurfaceHolder,并设置Callback为this:

    surfaceHolder = getHolder();
    surfaceHolder.addCallback(this);


    2、创建线程,在线程中完成画图,并在surfaceCreated(SurfaceHolder holder)中启动它;

    当Surface创建完成之后就会调用该方法,我们在它里面启动我们的画图进程。

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
           thread = new Thread(this);
           thread.start();
        }

    因此还要在类中实现Thread的runnable:

public class Suefaceviewtest extends SurfaceView implements SurfaceHolder.Callback,Runnable{
        ...
        ...
}

    为了防止视图在显示时被修改而产生视图撕裂,SurfaceView使用了双缓冲的策略,也就是,一个缓冲显示(front buffer),一个缓冲绘图(back buffer),下一帧显示时,交换两个缓冲。而App的绘图过程就在这交换之间。

    具体来讲,首先要使用SurfaceHolder.lockCanvas()方法获取当前surface的可绘制区域,其返回值是一个Canvas,接着对该canvas进行绘图,最后使用SurfaceHolder.unlockCanvasAndPost(Canvas),来提交当前绘图。然后循环往复。

    在线程中实现画图:

        @Override
        public void run() {
           Canvas canvas=null;
           canvas = surfaceHolder.lockCanvas();
           if(canvas!=null){
               canvas.drawText("U-NI.CN", 100, 100, mypaint);
               surfaceHolder.unlockCanvasAndPost(canvas);
           }
        }

    动画或多次绘图只要在run里加入相应循环即可。

    3、在Activity或layout里实例化这个类,就可以完成一次基本的使用了。

    运行截图:

    1458582036.png


    完整代码:code.rar


    关于SurfaceView双缓冲以及SurfaceView的显示原理相关的理解下篇文章再说。



    U-NI.CN 版权所有 未经同意 不得转载

暂无评论
发表评论