1 / 18
文档名称:

android的图像图像绘图-surfaceview.ppt

格式:ppt   页数:18页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

android的图像图像绘图-surfaceview.ppt

上传人:012luyin 2016/7/3 文件大小:0 KB

下载得到文件列表

android的图像图像绘图-surfaceview.ppt

相关文档

文档介绍

文档介绍:android 的图像图像-SurfaceView 类 2017-2-27 View 和 SurfaceView ? View 类是 android 的一个超类,每一个 View 都有一个用于绘画的画布, 这个画布可以进行任意的扩展。有的时候我们需要自定义 VIew 实现自己想要的视图。 view 、 SurfaceView 是游戏开发中经常用到的视图。? View :显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在 UI主线程内更新画面,速度较慢。? SurfaceView :基于 view 视图进行拓展的视图类,更适合 2D 游戏的开发;是 view 的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比 view 快。 View 的缺陷? View 缺乏双缓冲机制?当程序需要更新 View 上的图像时,必须重绘 View 上显示的整张图片。 SurfaceView 类? SurfaceView 是从 View 基类中派生出来的显示类,直接子类有 GLSurfaceView 和 VideoView , GL 和视频播放以及 Camera 摄像头一般均使用 SurfaceView. ? SurfaceView 可以控制表面的格式,比如大小、显示在屏幕中的位置,最关键是的提供了 SurfaceHolder 类,使用 getHolder 方法获取,相关的方法有 lockCanvas() 、 lockCanvas(Rect dirty) 、 removeCallback(Callback callback) 、 unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制。?对于 Surface , Android 底层还提供了 GPU 加速功能,所以一般实时性很强的应用中主要使用 SurfaceView 而不是直接从 View 构建,同时 Android 后面用到的 OpenGL 中的 GLSurfaceView 也是从该类实现。 2017-2-27 callback 接口?只要继承 SurfaceView 类并实现 接口就可以实现一个自定义的 SurfaceView , 在底层的 Surface 状态发生变化的时候通知 View , 具有如下的接口: ? surfaceCreated(SurfaceHolder holder) :当 Surface 第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制 Surface 。? surfaceChanged(SurfaceHolder holder, int format, int width,int height) :当 Surface 的状态(大小和格式)发生变化的时候会调用该函数, 在 surfaceCreated 调用后该函数至少会被调用一次。注意:一个 SurfaceView 只在 () 和 () 调用之间是可用的,其他时间是得不到它的 Canvas 对象的( null )。 Android-surfaceView 与 View 的区别? SurfaceView 和 View 最本质的区别在于, surfaceView 是在一个新起的单独线程中可以重新绘制画面,而 View 必须在 UI的主线程中更新画面。那么在 UI的主线程中更新画面可能会引发问题,比如更新画面的时间过长,那么主 UI线程会被正在绘制的函数阻塞。那么将无法响应按键、触屏等消息。使用 surfaceView ,由于是在新的线程中更新画面所以不会阻塞 UI主线程。但这也带来了另外一个问题,就是事件同步。比如触屏了一下,需要 surfaceView 中 thread 处理,一般就需要有一个 event queue 的设计来保存 touch event ,这会稍稍复杂一点,因为涉及到线程同步。所以基于以上,根据游戏特点,一般分成两类: (1 ) 被动更新画面的。比如棋类,这种用 view 就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate 。因为这种情况下,这一次 Touch 和下一次的 Touch 需要的时间比较长些,不会产生影响。(2 ) 主动更新。比如一个人在一直跑动。这就需要一个单独的 thread 不停的重绘人的状态