Android SurfaceView android-SurfaceView 类 2016-8-29.

Slides:



Advertisements
Similar presentations
面向侧面的程序设计 方林博士 本文下载地址:
Advertisements

第一章 餐饮服务程序 学习目的: 掌握餐饮服务四个基本环节的内容 正确表述和运用各种餐饮形式的服务程序 熟悉并利用所学知识灵活机动地为不同需求的 客人提供服务.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
石家庄迅步网络科技有限公司 联系人:张会耀 电话:
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
實驗五:多媒體播放器選單介面.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
地價稅簡介.
第七章 多媒体开发.
第11章 Java多媒体技术.
生育保险 朝阳社保中心支付部:黄玮.
在PHP和MYSQL中实现完美的中文显示
《环游西藏》之二 碧玉湖 音乐《白塔》 摄制:C&Y.
第九章 字符串.
實驗四:單位轉換程式.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
Java Applet 介绍.
使用Android控制Arduino 史先强
蓄势待发 知识准备阶段.
指導老師:廖俊鑑 專題生:高律智 楊文偉 陳宏偉 許偉澤 黃鴻明
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
第四次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
ANDROID 中的 3D 繪圖 作者:陳鍾誠.
Chapter 6 進階UI設計.
Android + Service 建國科技大學 資管系 饒瑞佶.
6.4 Notification 通知栏.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
PaPaPa项目架构 By:Listen 我在这.
平面繪圖與動畫.
C/C++/Java 哪些值不是头等程序对象
資訊學科中心研習 JAVA程式設計專題 臺北市立大理高級中學 黃世隆 2019/2/23.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
$9 泛型基础.
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
分裂对象模型 C++ otcl.
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java语法基础.
华为— S7-201c 外观设计 S7-201c 建议零售价格:2588元 上市时间:2011年 10月 20 日
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
CustomView(自定義視圖) 、 畫布、顏色及多點觸控 靜宜大學資管系 楊子青
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
第2章 Java语言基础.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Presentation transcript:

Android SurfaceView android-SurfaceView 类

Android SurfaceView View 和 SurfaceView View 类是 android 的一个超类,每一个 View 都有一个用于绘画的画布,这 个画布可以进行任意的扩展。有的时候我们需要自定义 VIew 实现自己想 要的视图。 view 、 SurfaceView 是游戏开发中经常用到的视图。 View :显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件 函数等;必须在 UI 主线程内更新画面,速度较慢。 SurfaceView :基于 view 视图进行拓展的视图类,更适合 2D 游戏的开发; 是 view 的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面 速度比 view 快。

Android SurfaceView 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 也是从该类实现。

Android SurfaceView callback 接口 只要继承 SurfaceView 类并实现 SurfaceHolder.Callback 接口就可以实现 一个自定义的 SurfaceView , SurfaceHolder.Callback 在底层的 Surface 状 态发生变化的时候通知 View , SurfaceHolder.Callback 具有如下的接口 : surfaceCreated(SurfaceHolder holder) :当 Surface 第一次创建后会立即 调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作 ,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中 绘制 Surface 。 surfaceChanged(SurfaceHolder holder, int format, int width,int height) : 当 Surface 的状态(大小和格式)发生变化的时候会调用该函数,在 surfaceCreated 调用后该函数至少会被调用一次。 注意:一个 SurfaceView 只在 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 调用之间是可用的,其他时间是得不到 它的 Canvas 对象的( null )。

Android SurfaceView 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 不停的重绘人 的状态,避免阻塞主线程。所以显然 view 不合适,需要 surfaceView 来控制。

Android SurfaceView 使用 SurfaceView 绘制矩形 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } class MyView extends SurfaceView implements SurfaceHolder.Callback{ SurfaceHolder holder; public MyView(Context context) { super(context); holder=getHolder(); holder.addCallback(this); } public void surfaceCreated(SurfaceHolder holder) { new Thread(new MyThread()).start(); }

Android SurfaceView 使用 SurfaceView 绘制矩形 class MyThread implements Runnable{ public void run() { // 锁定画布,通过其返回的画布对象 canvas ,在其上面画图 Canvas canvas=holder.lockCanvas(); canvas.drawColor(Color.WHITE); Paint paint=new Paint(); paint.setColor(Color.YELLOW); canvas.drawRect(10, 10, 220, 180, paint); holder.unlockCanvasAndPost(canvas);// 结束锁定画图,并提交编辑 }

Android SurfaceView SurfaceView 绘图机制 重写 CallBack 对象的 surfaceCreate 方法 ,在该方法中为 SurfaceView 绘制背景, 并避免背景图片被下一次 lockCanvas 遮 挡。 监听触摸事件,每次触摸屏幕时,程序 会锁定触碰周围的区域,那么就只更新 该区域的数据,而且本次的 lockCanvas 会遮挡上一次的 lockCanvas 后绘制的图 形。 注:第一次绘制的图形可能会被第二次 的 lockCanvas 遮挡,第三次的 lockcanvas 又可能遮挡第二次 lockCanvas 的区域,但不可能遮挡第一 次的 lockCanvas 区域

Android SurfaceView SurfaceView 绘图机制 holder.addCallback(new Callback() { public void surfaceDestroyed(SurfaceHolder holder) {} public void surfaceCreated(SurfaceHolder holder) { Canvas canvas=holder.lockCanvas(); Bitmap bitmap=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sun); canvas.drawBitmap(bitmap, 0, 0, null); holder.unlockCanvasAndPost(canvas); holder.lockCanvas(new Rect(0,0,0,0)); holder.unlockCanvasAndPost(canvas); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} });

Android SurfaceView SurfaceView 绘图机制 sf.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){ int cx=(int) event.getX(); int cy=(int) event.getY(); Canvas canvas=holder.lockCanvas(new Rect(cx-50,cy-50,cx+50,cy+50)); canvas.save(); canvas.rotate(30, cx, cy); paint.setColor(Color.YELLOW); canvas.drawRect(cx-40, cy-40, cx, cy, paint); canvas.restore(); paint.setColor(Color.GREEN); canvas.drawRect(cx, cy, cx+40, cy+40, paint); holder.unlockCanvasAndPost(canvas); } return false; } });