`
mmdev
  • 浏览: 12950907 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android SurfaceView 详解(一)

 
阅读更多

最近有接触到SurfaceView,各种不熟悉,在看完各路大神的Bolg帮助下,成长不少。做个小结,与大家共同进步微笑

一、先说一下:View类和SurfaceView类

(1.)View类:

View 类是Android 的一个超类,每个View都有一个用于绘画的画布,这个画布可以进行任意的扩展。
当需要绘制复杂的图像或者对程序的执行效率要求比较高的时候,View并不能满足需求。View是Widget框架下的一个直接拖拉的控件产物。例如:当需要双缓冲来显示,直接访问画布canvas,这些 都导致了我们需要比View更加强大的SurfaceView。

View:显示视图,内置画布,提供图形绘制函数,触屏时间、按键事件函数等,必须在UI主线程内更新画面,速度较慢。
(2.)SurfaceView类:(API)

SurfaceView 是View的继承类,这个视图里内嵌了一个专门用于绘制的Surface。可以控制这个Surface的格式和尺寸。SurfaceView控制这个Surface的绘制位置。
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类上使用双缓冲机制,在新的线程中跟新画面所以新界面速度比view快。
Surface是纵深排序的,这说明它总在自己所在的窗口的后面。SurfaceView 提供了一个可见区域,只有在这个可见区域内的surface部分内容才可见,可见区域外部部分不可 见。surface的排版显示受到视图层级关系的影响,它的兄弟节点会在顶端显示。这意味者surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如:文本和按钮等控件)。但是,当surface上面有透明控件时,它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。

Surfaceview变的可见时,surface被创建,surfaceView隐藏前,surface被毁灭。这样可以节省资源。surface创建:surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder).
SurfaceView的核心提供了两个线程:UI线程和渲染线程。应该注意的是:
a.所有的SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序的主线程。渲染线程所要访问的各种变量应该做同步处理。
b.由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHoledr.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效地surface.

二、SurfaceView类 和View类的区别

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

所以在游戏的应用上,根据游戏的特点,一般分为两类:
a. 被动更新画面的。比如棋类,这种用view就好。因为画面的跟新依赖于onTouch来更新,可以直接使用invalidate.因为这种情况下,这一次Touch和下一次Touch需要的时间比较长些,不会产生

影响。
b.主动更新:比如一个人在一直跑动。这就需要一个单独的thread不停地重绘人的转台,避免阻塞mian UI Thread 。所以显然view 不适合,需要surfaceView来控制。

分享到:
评论

相关推荐

    Android 自定义SurfaceView详解

    本文主要介绍Android SurfaceView自定义方法,这里对SurfaceView的基础知识做了详解,并附简单的示例代码,以便参考,有需要的小伙伴可以参考下

    【Android基础】(12)SurfaceView绘图API详解

    【Android基础】(12)SurfaceView绘图API详解代码

    SurfaceView运行机制详解

    SurfaceView运行机制详解 剖析BACK与HOME按键及切入后台等异常处理

    Android SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常

    本文主要介绍Android SurfaceView运行机制,这里整理了详细的资料来讲解SurfaceView的运行原理,并附示例代码参考,有需要的小伙伴可以参考下

    Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法

    1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView。结果,每次打开程序第一次进入到该Activity时都会闪屏黑一下。原因就出在SurfaceView。 详解:...

    Android View类与SurfaceView类详解

    本文主要介绍Android View类与SurfaceView类,这里提供了详细的Android View类和SurfaceView类的使用方法,有兴趣的小伙伴可以参考下

    Android编程之SurfaceView实例详解

    本文实例讲述了Android编程之SurfaceView用法。分享给大家供大家参考,具体如下: 关于surfaceView相关知识: View和SurfaceView主要区别: 1. View只能在UI线程中刷新,而SurfaceView可以在子线程中刷新 2. ...

    Android游戏开发20回合

    Android游戏开发三 View类详解 Android游戏开发四 Canvas和Paint实例 Android游戏开发五Path和Typeface Android游戏开发六 自定义View Android游戏开发七 自定义SurfaceView Android游戏开发八 SurfaceView类实例 ...

    Android编程之SurfaceView学习示例详解

    主要介绍了Android编程之SurfaceView学习示例,结合实例分析了SurfaceView的功能、使用方法与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下

    Android开发教程之调用摄像头功能的方法详解

    第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码 摄像头权限: <uses android:name=android.permission....

    Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解

    本文通过实例代码给大家讲解android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

    Android代码-Android相机预览拍照录像滤镜详解

    Android Camera 本系列会包括Android Camera预览,拍照,视频录制,播放,滤镜及渲染等,还会对相机系统原理做深入分析。 一、相机预览 序号 项目名称 内容简介 1 GLSurfacePreview GLSurfaceView OpenGL...

    Android游戏开发之旅

    3.Android游戏开发之旅三 View类详解 4.Android游戏开发之旅四 Canvas和Paint实例 5.Android游戏开发之旅五 Path和Typeface 6.Android游戏开发之旅六 自定义View 7.Android游戏开发之旅七 自定义SurfaceView 8....

    android开发揭秘PDF

    2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建HelloAndroid项目 2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 ...

    android开发资料大全

    【Android系统原理与开发要点详解】/底层 应用 框架 Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程)...

    Android适配底部虚拟按键的方法详解

    在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示) 通过google了很多方法并尝试终于解决了这个问题,达到如下效果: 每次进入界面时虚拟按键自动隐藏 手动...

    《Android应用开发揭秘》附带光盘代码.

     2.3 创建第一个Android项目——HeUoAndroid  2.3.1 创建HelloAndroid项目  2.3.2 运行HelloAndroid及模拟器的使用  2.3.3 调试HelloAndroid  2.4 小结  第二部分 基础篇  第3章 Android程序设计基础  3.1 ...

    Android应用开发揭秘pdf高清版

     国内第一本基于Android 2.0的经典著作,5大专业社区联袂推荐,权威性毋庸置疑!《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络...

Global site tag (gtag.js) - Google Analytics