SuperView和View的区别
[b][size=large][align=center]SuperView和View的区别[/align][/size][/b]
在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。
这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas()
Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过重写下面方法实现。
使用的SurfaceView的时候,一般情况下要对其进行创建,销毁,改变时的情况进行监视,这就要用到 SurfaceHolder.Callback.
class XxxView extends SurfaceView implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//看其名知其义,在surface的大小发生改变时激发
public void surfaceCreated(SurfaceHolder holder){}
//同上,在创建时激发,一般在这里调用画图的线程。
public void surfaceDestroyed(SurfaceHolder holder) {}
//同上,销毁时激发,一般在这里将画图的线程停止、释放。
}
对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。
SurfaceView和View最本质的区别在于,[b]surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。[/b]
那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。
[b]1[/b] 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
[b]2[/b] 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
SurfaceView可以直接对画面的大小以及在屏幕中的位置进行控制,关键的是可以使用SurfaceHolder类,使用getHolder方法获取屏幕信息,然后进行绘制。
其流程为:
1.创建一个SurfaceView的子类,实现SurfaceHolder.Callback接口。
得到这个SurfaceView的SurfaceHolder对象holder。
holder.addCallback(callback),也就是实现SurfaceHolder.Callback接口的类对象。
2.在SurfaceHolder.Callback.surfaceCreated()调用过后holder.lockCanvas()对象就可以得到 SurfaceView对象对应的Canvas对象canvas了。
3.用canvas对象画图。
4.[b]画图结束后调用holder.unlockCanvasAndPost()就把图画在窗口中了。 [/b]
SurfaceView可以多线程访问,在多线程中画图。
SuperView和View的区别相关推荐
- APIView和View的区别
APIView和View的区别 API继承了View 重写了as_view方法 --豁免csrf def dispatch(self, request, *args, **kwargs): self. ...
- SurfaceView和View的区别
前言:努力,离目标的五分之一又近了一步. 1.view view在api中的结构 java.lang.Object android.view.View 直接子类: AnalogClock, Ima ...
- SurfaceView和普通view的区别及简单使用
1 SurfaceView介绍 SurfaceView第一印象它是一个view,因为它继承了View,有两个直接子类GLSurfaceView,VideoView.但根据SDK文档SurfaceVie ...
- 【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别
文章目录 一.动画效果添加对象 二.动画效果类型 三.动画效果与实际属性 四.开发复杂程度 属性动画 Property Animation 可以为 任何对象 ( View 对象 / 非 View 对象 ...
- numpy.ndarray.reshape()torch.Tensor.reshape()与numpy.ndarray.view()torch.Tensor.view()的区别(view_as())
参考文章:[Python] 更改矩阵形状:reshape(m,n).view(m,n)和view_as(tensor)
- SAP ABAP CDS view和 HANA CDS view的区别,CDS consumption view 和 BO view 的区别
这两种技术都是SAP提出的"Code pushdown"理念的具体实现.SAP ABAP CDS view位于ABAP应用服务器层,使用OPEN SQL,支持的数据库不限HANA, ...
- Android之Surface/Window/View/SurfaceView区别
Activity获得一块显存(Surface && FrameBuffer),然后在上面绘图(OpenGL && GPU),最后交给设备 去显示(Display设备). ...
- create view 和 create or replace view的区别
create or replace view的意思就是若数据库中已经存在这个名字的视图的话,就替代它,若没有则创建视图: create则不进行判断,若数据库中已经存在的话,则报错,说对象已存在:
- vi和view的区别 linux,vi与vim的区别
Vim是从 vi 发展出来的一个文本编辑器 .代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和Emacs 并列成为类Unix系统 用户最喜欢的编辑器. Vim的第一个版本由B ...
- 数据库中表table与视图view的区别
首先了解一下什么是视图. 在我们查询的过程中,select column1,column2-- from table,此时会出来一个结果,这个我们所看到的结果是一个表的样子,那么这个虚表就是一个视图v ...
最新文章
- 读书笔记——Python第一个程序Hello world
- python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
- python初始化方法对应的变量是全局变量嘛_在Python中初始化全局变量的正确方法...
- 爬取淘宝定价需要多久时间_如何对设计工作进行定价—停止收​​取时间并专注于价值
- 到底什么培训适合你?
- 怎么写显示商品图片_虾皮商店封面图片 虾皮商店介绍怎么写吸引人
- matlab角点坐标获取,MatLab角点检测(harris经典程序) | 学步园
- 这样讲闭包,你终生难忘
- postfix发送邮件报错:mail for xxxxx.com loops back to myself
- 幂级数——函数的幂级数展开
- 视频自动生成字幕VideoSrt
- python 省份排序_Python常用的排序
- 单模光纤最大传输距离为多少_单模光纤的最长传输距离有多远?单模,多模光纤有什么不同呢?...
- 武科大计算机科学与技术教务处,欢迎访问武汉理工大学计算机科学与技术学院...
- 未找到任何音频输出设备的解决方法
- Windows 制作 QQ加好友 或 临时会话 的链接地址
- 【企业微信-客户服务】错误代码:48002, 错误信息:API接口无权限调用
- PYNQ入门(2)——启动系统及例程查看
- 解决MATLAB2018b打开m文件后注释乱码的问题
- Java1Java2