SurfaceView和View的区别

编者建议:本人诚心的建议您拿张纸出来,在纸张上写一遍。写完一遍后,所有的理论、思路便都能清晰了。因为我也是写了一遍,所有的便都会了。好了,别的不多说,下面进入正文。


一、SurfaceView和View最本质的区别在于:

SurfaceView是在一个新启的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。在UI的主线程中更新画面,可能会引发一些问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。如果你使用SurfaceView,便不会阻塞你的UI主线程,因为它是在新的线程中更新画面。但是这也带来了另外一个问题,就是事件同步。比如你触摸了一下屏幕,你需要在SurfaceView中的thread处理,一般就需要一个event queue的设计来保存touch event,这会稍微复杂一点,因为又涉及到了线程同步。

所以基于以上所说,根据游戏特点,一般分成两类:

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

2、主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI 的 thread。所以显然View不合适,需要SurfaceView来绘制。


二、SurfaceView的简介:

在一般的情况下,应用程序的View都是在相同的GUI线程中绘制的。这个主应用程序线程同时也用来处理所有的用户交互(如:按钮单击或者文本输入)。SurfaceView封装了一个Surface对象,而不是Canvas。这一点很重要,因为Surface可以使用后台线程绘制。对于那些资源敏感的操作,或者那些要求快速更新或者高速帧率的地方(例如,使用3D图形,创建游戏,或者实时预览摄像头),这一点特别有用。

但是独立于GUI线程进行绘图也是有坏处的,代价便是额外的内存消耗。所以,虽然它是创建定制的View的有效方式(有时甚至是必须的),但是使用SurfaceView的时候仍然要保持谨慎。


三、何时应用SurfaceView

SurfaceView使用的方式与View所派生的类都是完全相同的。可以像其他View那样应用动画,并把它们放到布局中。SurfaceView封装的Surface支持使用所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库。

使用OpenGL,你可以在Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法可以依靠硬件加速(可用的时候)来极大地提高性能。对于显示动态的3D图像来说(如:那些使用Google Earth功能的应用程序,或者那些提供沉浸体验的交互式游戏),SurfaceView特别有用。它还是实时显示摄像头预览的最佳选择。


四、创建一个新的SurfaceView控件

要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder。Callback。

SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder对象的引用,其中包含了当前有效的Surface。

一个典型的SurfaceView设计模型包括一个有Thread所派生的类,它可以接受对当前的SurfaceHolder的引用,并独立地更新它。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值