一、SurfaceView和VIew的区别
1、VIew主要适用于主动更新情况,并且只能在主线程绘制和更新画面,以及在绘图时没有使用双缓冲机制
2、surfaceView主要适用于被动更新,如频繁的刷新,因为它可以通过子线程来进行页面的刷新,而且在底层已经实现双缓冲机制,绘图时不会出现闪烁问题
总而言之,SurfaceView继承自View,主要用于视频、音频或耗时的绘图和经常更新视图(地图等等)显示,如果自定义的view需要频繁刷新,或者刷新时处理的数据量大,则可以考虑surfaceview取代view,因为View在主线程中会阻塞主线程,若view的刷新操作超过16ms则用户视觉会感到卡顿,由于surfaceView是子线程处理就不会
以下一段结论是抄自老罗之旅的 :外链网址已屏蔽
SurfaceView类的成员变量mRequestedType描述的是SurfaceView的绘图表面的类型,一般来说,它的值可能等于SURFACE_TYPE_NORMAL,也可能等于SURFACE_TYPE_PUSH_BUFFERS。
当一个SurfaceView的绘图表面的类型等于SURFACE_TYPE_NORMAL的时候,就表示该SurfaceView的绘图表面所使用的内存是一块普通的内存。一般来说,这块内存是由SurfaceFlinger服务来分配的,我们可以在应用程序内部自由地访问它,即可以在它上面填充任意的UI数据,然后交给SurfaceFlinger服务来合成,并且显示在屏幕上。在这种情况下,SurfaceFlinger服务使用一个Layer对象来描述该SurfaceView的绘图表面。
当一个SurfaceView的绘图表面的类型等于SURFACE_TYPE_PUSH_BUFFERS的时候,就表示该SurfaceView的绘图表面所使用的内存不是由SurfaceFlinger服务分配的,因而我们不能够在应用程序内部对它进行操作。例如,当一个SurfaceView是用来显示摄像头预览或者视频播放的时候,我们就会将它的绘图表面的类型设置为SURFACE_TYPE_PUSH_BUFFERS,这样摄像头服务或者视频播放服务就会为该SurfaceView绘图表面创建一块内存,并且将采集的预览图像数据或者视频帧数据源源不断地填充到该内存中去。注意,这块内存有可能是来自专用的硬件的,例如