View与SurfaceView

一、View和SurfaceView的区别View只能在UI主线程进行修改,在后台线程不可以修改UI元素。其中View子类实现修改主要通过复写View的onDraw()方法。

SurfaceView可以通过后台线程进行相关的线程进行修改。主要通过获得SurfaceHolder对象来获取Canvas对象,SurfaceView的子类实现SurfaceView.CallBack接口来实现Surface对象的创建、改变、销毁等状态的处理。SurfaceView比较适合:界面需要迅速更新、对帧率要求比较高的情况。使用SurfaceView需要主要以下几点情况:
(1)SurfaceView和SurfaceHolder.Callback接口中的函数都是从当前线程中调用的(一般而言就是程序的主线程)。有关资源状态要注意和绘制线程之间保持同步。
(2)在绘制线程中必须先合法化的获取SurfaceHolder才能开始绘制内容,合法的状态是在以下的两个状态SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间。另外Surface的类型为SURFACE_TYPE_PUSH_BUFFERS的时候不合法。额外的绘制线程会消耗系统资源,在使用SurfaceView的注意

二、使用SurfaceView

只要继承SurfaceView类并且实现SurfaceHolder.Callback接口就可以实现自定义的SurfaceView。SurfaceHolder.Callback在底层Surface状态发生变化的时候会通知View。SurfaceHolder.Callback具有以下接口:
surfaceCreated(SurfaceHolder holder): 当Surface第一次创建后会立即调用该函数。程序在该函数中可以实现一些界面绘制相关的初始化工作,一般情况下都在另外的线程来绘制界面,所以在不在这个函数中绘制Surface。而会启动额外的线程,来实现界面的绘制。
surfaceDestroyed(SurfaceHolder holder):当Surface被摧毁时调用该函数,该函数调用后就不能继续使用Surface了,一般会把绘制的线程停止和清理使用的资源。
surfaceChanged(SurfaceHolder holder,int format,int width,int height):当Surface的状态发生变化时就会调用该函数,在surfaceCreated调用该函数至少一次。一般不会再该函数中对界面做处理。
       通过SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface 就在SurfaceHolder对象内。虽然Surface保存了当前窗口的像素数据,但是在使用过程中是不直接和Surface打交道的,由SurfaceHolder的Canvas lockCanvas()或则Canvas lockCanvas(Rect dirty)函数来获取Canvas对象,通过在Canvas上绘制内容来修改Surface中的数据。如果Surface不可编辑或则尚未创建调用该函数会返回null,在 unlockCanvas() 和 lockCanvas()中Surface的内容是不缓存的,所以需要完全重绘Surface的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect dirty)函数来指定一个dirty区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,SurfaceView会获取Surface的一个同步锁直到调用unlockCanvasAndPost(Canvas canvas)函数才释放该锁,这里的同步机制保证在Surface绘制过程中不会被改变(被摧毁、修改)。
       当在Canvas中绘制完成后,调用函数unlockCanvasAndPost(Canvas canvas)来通知系统Surface已经绘制完成,这样系统会把绘制完的内容显示出来。为了充分利用不同平台的资源,发挥平台的最优效果可以通过SurfaceHolder的setType函数来设置绘制的类型,目前接收如下的参数:
SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface
SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface
SURFACE_TYPE_GPU:适用于GPU加速的Surface
SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值