surfaceView和View区别

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


所以基于以上,根据游戏特点,一般分成 两类。 
----------------------------------------------------------------------------------------------------
1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更
新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间
比较长些,不会产生影响。  
2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免
阻 塞main UI thread。所以显然view不合适,需要surfaceView来控制。


SurfaceView简介  
----------------------------------------------------------------------------------------------------
在一般的情况 下,应用程序的View都是在相同的GUI线程中绘制的。这个主应用程序线程同时
也用来处理所 有的用户交互(例如,按钮单击或者文本输入)。我们已经学习了如何把容易阻塞的 
处理移动到后台线程中。遗憾的是,对于一个View的onDraw方法,不能这样做,因为从后台线
程 修改一个GUI元素会被显式地禁止的。当需要快速地更新View的UI,或者当渲染代码阻塞 GUI
线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。 


SurfaceView封装了一个Surface对象,而不是Canvas。这一点很重要,因为Surface可以使用后 
台线程绘制。对于那些资源敏感的 操作,或者那些要求快速更新或者高速帧率的地方,例如,使
用3D图形,创建游戏,或者实时预览摄像头,这一点特别有用。独立于GUI线程进行绘图的代价
是额外的内存消耗,所以,虽然它是创建定制的View的有效方式--有时甚至是必须的,但是使用
SurfaceView的时候仍然要保持谨慎。


1. 何时应该使用SurfaceView?
SurfaceView使用的方式与任何View所派生的类都是完全相同 的。可以像其他View那样应用动画
,并把它们放到布局中。SurfaceView封装的Surface支持使用所有标准Canvas方法进行绘图,同
时也支持完全的OpenGL ES库。使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象
,与在2D画布上模拟 相同的效果相比,这种方法可以依靠硬件加速(可用的时候)来极大地提高性能。
对于显示动态的3D图像来说,例如,那些使用Google Earth功能的应用程序,或者那些提供沉浸体
验的交互式游戏,SurfaceView特别有用。它还是 实时显示摄像头预览的最佳选择。
2. 创建一个新的SurfaceView控件  
要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。
SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder
对象的引用,其中包含了当 前有效的Surface。一个典型的SurfaceView设计模型包括一个由Thread
所派生的类,它可以接收对当前的SurfaceHolder的引用,并独 立地更新它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个漂亮的输出MySql数据库表结构的PHP页面

经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作。…

如何成就百万点击的名博

时近年底,去年我写过《程序员过年——想想自己到底想干啥》,今年我想说说如何成就自己的百万点击技术博客。 在当下博客世界里,动辄过千万甚至过亿的博主并不少见,但谈到程序员圈子里面,过百万已算是不错的成绩。CSDN现…

mysql5.7主从复制遇到的坑

datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockreplicate-do-dbshoppingbinlog-do-dbshopping #复制的库server-id 3#skip-grant-tables 1symbolic-links0replicate-do-dbshop #需要复制的库binlog-do-dbshop tmpdir /tmp #这个最好给个目录 否则会报错 &#xff0c…

JAVA读取2g数据的速度_Java 读取大容量excel

项目要求导入excel, 但是文件很大,一次性读进去会导致内存不足而报错,下面是我解决的方法:首先倒入需要的jarorg.apache.poipoi-ooxml3.17org.apache.poipoi-ooxml-schemas3.17org.apache.poipoi3.17com.monitorjblxlsx-streamer1…

String(byte[] bytes, int offset, int length)

public String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。参数: bytes:要解码为字符的 byte offset: 要解码的第一个 byte 的索引 length: 要解码的…

java 属于以下哪种语言_Java属于以下哪种语言?( )

对于宝来(Bora2004)轿车EPS系统,属于当转向扭矩传感器G269发生故障时,只需单独更换转向扭矩传感器就行了。一般说来,下语可以根据下列因素判断趋势线的有效性 ( )。关于股价的移动规律,属于下列论述不正确的是( )。如果希望预测未…

logback 配置

logback 的使用说明 1、maven 依赖配置 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><logback.version>1.1.7</logback.version><slf4j.version>1.7.21</slf4j.version></properties><…

android 的各种文件类

File文件类 使用户可以忽略不同操作系统带来的影响 可以抽象文件的路径方式---------------------------------------------------------------------------------RandomAccessFile主要用来进行对文件操作的类 它并不继承inputStream 是一个独立设计的用来进行文件操作的类----…

C#设计模式(19)——状态者模式(State Pattern)

原文:C#设计模式(19)——状态者模式&#xff08;State Pattern&#xff09;一、引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题&#xff0c;在本文中将首先通过一个银行账户的例子来解释状态者模式&#xff0c;通过这个例子使大家可以对状态…

OLTP与OLAP

当今的数据处理大致可以分成两大类&#xff1a;联机事务处理OLTP&#xff08;on-line transaction processing&#xff09;、联机分析处理OLAP&#xff08;On-Line Analytical Processing&#xff09;。OLTP是传统的关系型数据库的主要应用&#xff0c;主要是基本的、日常的事务…

揭秘IT人才特点:中美印日四国程序员比较

揭秘IT人才特点&#xff1a;中美印日四国程序员比较 最近以裁判的身份参加了公司举办的编程大赛&#xff0c;发现高手云集&#xff0c;对公司内部的程序员能力也有了更深入的了解。我觉得编程能力对程序员而言&#xff0c;虽然很重要&#xff0c;但并不是全部。那么作为一个程…

BaseColumns类的作用

这个类只是提供了两个字段&#xff0c;一个是"_id"一个是"_count"&#xff0c;便于调用数据库时导致拼写错误&#xff0c;你也可以扩展它&#xff0c;或者自定义这么个&#xff0c;然后直接调用它的常量名&#xff0c;防止写sql语句时把列名拼错 /** Copyr…

java如何限制输入值_[限制input输入类型]常用限制input方法

常用限制input的方法1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocustrueinput type"submit" value"提交" hidefocus"true"2.只读文本框内容,在input里添加属性值 readonlyinput type"text" readonly3.防止退…

如何规范 CSS 的命名和书写

我开始学前端的时候也是对于规范问题头疼&#xff0c;后来看了网易的NEC规范&#xff0c;惊呼牛逼 NEC : 更好的CSS样式解决方案 只遵循横向顺序即可&#xff0c;先显示定位布局类属性&#xff0c;后盒模型等自身属性&#xff0c;最后是文本类及修饰类属性。 →显示属性自身属性…

app性能测试指标

性能测试在软件的质量保证中起着重要的作用&#xff0c;它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面&#xff1a;应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下&#xff0c;三方面有效、合理的结合&#xf…

《学做程序经理》完整版

文/Joel Spolsky 译/罗小平 指派一名优秀的程序经理&#xff0c;是团队产出优秀软件的重要前提之一。你的团队里可能没有这样的人&#xff0c;其实绝大多数团队都没有。 Charles Simonyi&#xff0c;这位曾与MarthaStewart&#xff08;译者注&#xff1a;美国女富豪&#…

java工程mvn引用jar_maven 项目加载本地JAR

将jar安装到本地的maven仓库1.首先确定本地有maven环境。2.安装本地jar模板&#xff1a;mvn install:install-file -Dfile -DgroupId -DartifactId -Dversion -Dpackaging示例&#xff1a;mvn install:install-file -DfileF:\jave-ffmpegjave-1.0.2.jar -DgroupIdffmpegjave -D…

compress()方法

boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) 把位图的压缩信息写入到一个指定的输出流中。如果返回true&#xff0c;可以通过传递一个相应的输出流到BitmapFactory.decodeStream()来重构该位图。注意&#xff1a;并非所有的格式都直接支…

token的三点注意项

token的安全是极度重要的 1&#xff1a;token的唯一性&#xff0c; 它代表着来自某应用系统用户的一次成功登录。我们可以利用java util包工具直接生成一个32位唯一字符串来实现。 String token UUID.randomUUID().toString(); 同时&#xff0c;我们定义一个javabean&#xff…

0.1 js复习

1.1 JavaScript的用途 JavaScript用来制作web页面交互效果&#xff0c;提升用户体验。 能够制作的页面效果&#xff1a;轮播图&#xff0c;无限瀑布流&#xff0c;tab切换&#xff0c;定位地图&#xff0c;表单验证等。 web前端三层来说&#xff1a; 结构层 HTML 从语义的角度&…