• Android SurfaceView


    SurfaceView

    Surface相当于绘制的容器,所有View和子类都是绘制在这里面。

    SurfaceView是View的子类,将Surface的数据显示出来。

    View适用主动更新视图,不需要频繁刷新。在主线程更新UI,没有双缓冲机制。

    SurfaceView适用于被动更新视图,频繁刷新。通过子线程更新UI,底层实现中就实现了双缓冲机制。

    SurfaceHolder

    SurfaceHolder是Surface的抽象接口,操纵surface的控制器。

    使用SurfaceView的getHolder()方法,获取SurfaceHolder对象

    在SurfaceView使用中需要的几个重要方法:

    void addCallback(SurfaceHolder.Callback var1);
    //为SurfaceHolder添加一个SurfaceHolder.Callback回调接口
    
    void removeCallback(SurfaceHolder.Callback var1);
    //从Surface持有者中删除回调接口
    
    Canvas lockCanvas();
    //获取Canvas对象,并锁定
    
    void unlockCanvasAndPost(Canvas var1);
    //释放同步锁,并显示
    
    void setFormat(int var1);
    //指定surface的像素格式,PixelFormat常量
    
    void setFixedSize(int var1, int var2);
    //固定Surface的宽高
    
    void setKeepScreenOn(boolean var1);
    //false是允许屏幕关闭,true强制屏幕打开状态

    SurfaceHolder.Callback

    实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期,它有三个回调方法:

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //Surface创建的时候调用
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
           //Surface大小被改变的时候调用
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //Surface被销毁的时候调用
    }    

    实现Runnable接口,利用子线程做绘图操作

    绘制方法需要在绘制前调用locakCanvas锁定画布,得到画布。

    绘制完成后需要调用lockCanvasAndPost方法来解锁画布,显示。

     @Override
     public void run() {
           draw();
     }
    
    private void draw() {
       try {
          mCanvas=mHolder.lockCanvas();
              //绘制
    
          }catch (Exception e){
    
          }finally {
                //避免黑屏情况,解锁画布
              if(mCanvas!=null){
                mHolder.unlockCanvasAndPost(mCanvas);
             }
         }
    }

     相关阅读

    SurfaceView开启相机预览

    SurfaceView实现跟随手指移动的光标

  • 相关阅读:
    Python之美[从菜鸟到高手]--Python垃圾回收机制及gc模块详解
    linux-memory-buffer-vs-cache
    MYSQL----myownstars(102)
    win10系统调用架构分析
    on io scheduling again
    Java并发编程
    elixir-lang
    mydumper工作原理, seconds_behind_master的陷阱和pt-heartbeat (102)
    深入理解JavaScript系列+ 深入理解javascript之执行上下文
    我们应该如何去了解JavaScript引擎的工作原理 系列
  • 原文地址:https://www.cnblogs.com/94xiyang/p/9481931.html
Copyright © 2020-2023  润新知