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来控制。

在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最本质的区别相关推荐

  1. surfaceView和View区别

    surfaceView和View最本质的区别在于:  ------------------------------------------------------------------------- ...

  2. android安卓SurfaceView与view的区别是什么?

    原贴: link 原贴: link surfaceView和View最本质的区别在于: surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面.那么在U ...

  3. SurfaceView和View的区别

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

  4. SurfaceView和TextureView的使用以及区别

    SurfaceView和TextureView的使用以及区别 一 . 什么时候使用SurfaceView 我们平时学习自定义view的过程中会发现自定义的View可以满足大部分的绘图需求,但是当我们需 ...

  5. [Redux/Mobx] redux-saga和redux-thunk有什么本质的区别?

    [Redux/Mobx] redux-saga和redux-thunk有什么本质的区别? saga 自己基本上完全弄了一套 asyc 的事件监听机制.虽然好的一方面是将来可以扩展成 worker 相关 ...

  6. 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!

    5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...

  7. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  8. 博通高通迈威尔螃蟹全志南方硅谷WiFi本质的区别

    之前写了 螃蟹wifi驱动在AP模式下存在挂死系统的问题_MengXP的博客-CSDN博客 后来我也做了很多实验,查阅了一些资料.做了一些思考,现在总结如下: 无线网卡芯片本身一定是包含一个PHY.D ...

  9. Java中IO和NIO的本质和区别

    文章目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序 ...

最新文章

  1. 机器人动力学建模实例(二):三连杆机械臂
  2. 114. Flatten Binary Tree to Linked List 二叉树展开为链表
  3. C++ vector类详解
  4. zabbix监控特殊端口(8080,80,8009等)
  5. 单链表删除指定范围内的元素
  6. 支付宝要给全国人民发100亿,7月1日起!
  7. java 文件上传 大小_java 上传文件大小转换为 GB/MB/KB/B
  8. apple_Apple WWDC 2018主题总结
  9. zookeeper的zxid
  10. 【心电信号】基于matlab自适应滤波算法胎儿心电信号提取【含Matlab源码 953期】
  11. 微信多开软件苹果版_微信多开教程—Mac版amp;Win版
  12. Tuxedo中间件常用命令
  13. python移植到stm32f205_Micropython学习(二)STM32移植
  14. 一款支持语音搜索及语音Voip的浏览器
  15. Apache Jena配置
  16. python结巴库下载_python结巴怎么安装
  17. 猫哥教你写爬虫 041--模拟登录-cookie
  18. animation心形--表白
  19. 公司网络机房搭建,信息化目标,网络故障处理办法
  20. Fiddler教程系列—介绍【必看】

热门文章

  1. Linux安装卸载 Mysql完整步骤
  2. 上线、发布、发版流程
  3. python3实现斐波那契数列--4种方法
  4. 你不知道的JavaScript--Item29 DOM基础详解
  5. 中大近代物理实验实验报告(LaTeX实现)
  6. 【Vue】高级系列(五)Vue模块化实战-demo2-任务清单todoList
  7. 聊聊大学室友在 TikTok 的工作和生活体验
  8. nuxt 更新部署因浏览器缓存导致页面错误解决方法
  9. 人工智能定义的 IT 基础设施浅析
  10. Thinkphp内核自动挂机阅读文章系统源码