设为首页 加入收藏

TOP

Android SurfaceView 详解
2014-11-24 12:46:54 来源: 作者: 【 】 浏览:0
Tags:Android SurfaceView 详解

最近有接触到SurfaceView,各种不熟悉,在看完各路大神的Bolg帮助下,成长不少。做个小结,与大家共同进步


一、先说一下:View类和SurfaceView类


(1.)View类:


当需要绘制复杂的图像或者对程序的执行效率要求比较高的时候,View并不能满足需求。View是Widget框架下的一个直接拖拉的控件产物。例如:当需要双缓冲来显示,直接访问画布canvas,这些 都导致了我们需要比View更加强大的SurfaceView。


View:显示视图,内置画布,提供图形绘制函数,触屏时间、按键事件函数等,必须在UI主线程内更新画面,速度较慢。


(2.)SurfaceView类:(API)


SurfaceView 是View的继承类,这个视图里内嵌了一个专门用于绘制的Surface。可以控制这个Surface的格式和尺寸。SurfaceView控制这个Surface的绘制位置。


SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类上使用双缓冲机制,在新的线程中跟新画面所以新界面速度比view快。


Surface是纵深排序的,这说明它总在自己所在的窗口的后面。SurfaceView 提供了一个可见区域,只有在这个可见区域内的surface部分内容才可见,可见区域外部部分不可 见。surface的排版显示受到视图层级关系的影响,它的兄弟节点会在顶端显示。这意味者surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如:文本和按钮等控件)。但是,当surface上面有透明控件时,它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。


Surfaceview变的可见时,surface被创建,surfaceView隐藏前,surface被毁灭。这样可以节省资源。surface创建:surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder).


SurfaceView的核心提供了两个线程:UI线程和渲染线程。应该注意的是:


a.所有的SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序的主线程。渲染线程所要访问的各种变量应该做同步处理。


b.由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHoledr.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效地surface.


二、SurfaceView类 和View类的区别


SurfaceView 和View的最本质的区别在于,surfaceView是在一个在新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面,可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞,那么将无法响应按键,触摸等消息。当使用surfaceView由于是在新的线程中更新画面所以不会阻塞你的UI主线程,但是这也会有另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这样就会有点复杂了。


View:必须在UI的主线程中更新画面,用于被动更新画面。


surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。


所以在游戏的应用上,根据游戏的特点,一般分为两类:


a. 被动更新画面的。比如棋类,这种用view就好。因为画面的跟新依赖于onTouch来更新,可以直接使用invalidate.因为这种情况下,这一次Touch和下一次Touch需要的时间比较长些,不会产生


影响。


b.主动更新:比如一个人在一直跑动。这就需要一个单独的thread不停地重绘人的转台,避免阻塞mian UI Thread 。所以显然view 不适合,需要surfaceView来控制。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Unity3D在Android上播放视频及rem.. 下一篇Android中使用assets下的资源——..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)