[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的区别相关推荐

  1. APIView和View的区别

    APIView和View的区别 API继承了View 重写了as_view方法 --豁免csrf def dispatch(self, request, *args, **kwargs): self. ...

  2. SurfaceView和View的区别

    前言:努力,离目标的五分之一又近了一步. 1.view view在api中的结构 java.lang.Object android.view.View   直接子类: AnalogClock, Ima ...

  3. SurfaceView和普通view的区别及简单使用

    1 SurfaceView介绍 SurfaceView第一印象它是一个view,因为它继承了View,有两个直接子类GLSurfaceView,VideoView.但根据SDK文档SurfaceVie ...

  4. 【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别

    文章目录 一.动画效果添加对象 二.动画效果类型 三.动画效果与实际属性 四.开发复杂程度 属性动画 Property Animation 可以为 任何对象 ( View 对象 / 非 View 对象 ...

  5. numpy.ndarray.reshape()torch.Tensor.reshape()与numpy.ndarray.view()torch.Tensor.view()的区别(view_as())

    参考文章:[Python] 更改矩阵形状:reshape(m,n).view(m,n)和view_as(tensor)

  6. SAP ABAP CDS view和 HANA CDS view的区别,CDS consumption view 和 BO view 的区别

    这两种技术都是SAP提出的"Code pushdown"理念的具体实现.SAP ABAP CDS view位于ABAP应用服务器层,使用OPEN SQL,支持的数据库不限HANA, ...

  7. Android之Surface/Window/View/SurfaceView区别

    Activity获得一块显存(Surface && FrameBuffer),然后在上面绘图(OpenGL && GPU),最后交给设备 去显示(Display设备). ...

  8. create view 和 create or replace view的区别

    create or replace view的意思就是若数据库中已经存在这个名字的视图的话,就替代它,若没有则创建视图: create则不进行判断,若数据库中已经存在的话,则报错,说对象已存在:

  9. vi和view的区别 linux,vi与vim的区别

    Vim是从 vi 发展出来的一个文本编辑器 .代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和Emacs 并列成为类Unix系统 用户最喜欢的编辑器. Vim的第一个版本由B ...

  10. 数据库中表table与视图view的区别

    首先了解一下什么是视图. 在我们查询的过程中,select column1,column2-- from table,此时会出来一个结果,这个我们所看到的结果是一个表的样子,那么这个虚表就是一个视图v ...

最新文章

  1. 读书笔记——Python第一个程序Hello world
  2. python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
  3. python初始化方法对应的变量是全局变量嘛_在Python中初始化全局变量的正确方法...
  4. 爬取淘宝定价需要多久时间_如何对设计工作进行定价—停止收​​取时间并专注于价值
  5. 到底什么培训适合你?
  6. 怎么写显示商品图片_虾皮商店封面图片 虾皮商店介绍怎么写吸引人
  7. matlab角点坐标获取,MatLab角点检测(harris经典程序) | 学步园
  8. 这样讲闭包,你终生难忘
  9. postfix发送邮件报错:mail for xxxxx.com loops back to myself
  10. 幂级数——函数的幂级数展开
  11. 视频自动生成字幕VideoSrt
  12. python 省份排序_Python常用的排序
  13. 单模光纤最大传输距离为多少_单模光纤的最长传输距离有多远?单模,多模光纤有什么不同呢?...
  14. 武科大计算机科学与技术教务处,欢迎访问武汉理工大学计算机科学与技术学院...
  15. 未找到任何音频输出设备的解决方法
  16. Windows 制作 QQ加好友 或 临时会话 的链接地址
  17. 【企业微信-客户服务】错误代码:48002, 错误信息:API接口无权限调用
  18. PYNQ入门(2)——启动系统及例程查看
  19. 解决MATLAB2018b打开m文件后注释乱码的问题
  20. Java1Java2

热门文章

  1. 什么是 Sidecar
  2. postgresql源码学习(38)—— 备份还原② - do_pg_stop_backup函数
  3. 故事会-设计模式-策略模式
  4. 《增长黑客》读书笔记
  5. C++中如何设置延时?
  6. 花生壳内网发布外网可以访问的网站
  7. 妇科癌症中的肠道菌群:病因、治疗潜力
  8. 数据目录是什么?为何需要它?
  9. ABO血型系统遗传规律表
  10. Personal deposit calculator(个人存款计算器)C#实现