人机交互实验-----骰子来袭
一.系统使用说明:
本次实验是在win7系统下的android的平台进行的。Eclipse系统没有自带的UML图生成插件,所以将ModleGoon插件下载到eclipse文件夹下的dropins文件夹中,重新启动eclipse后,可以在file—>new—>other打开的窗体看到ModleGoonDigrams的显示,其中包含三种类型的文件:Class Digrams,Interaction Digrams,以及Packge Dependencies Digrams。由于生成图是只需要显示类之间的关系即可,所以用Class Digrams即可。
关于eclipse系统的简介:
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
关于Android系统的简介:
Android是Google于20##年11月05日宣布的基于Linux平台的开源移动操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。它采用软件堆层的架构,主要分为三部分。底层以Linux内核工作为基础, 由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。
二. 实验要求:
根据已有的安卓框架和程序包,运行程序,经过漫长等待可以看到安卓系统的开机界面,运行其中的Cube_OpenGl图标的应用程序,可以看到一个很可爱的骰子,在鼠标的控制下可以实现旋转。而本次实验的任务就是让这个骰子还可以实现移动和放缩的功能,虽然功能简单,但是对于不熟悉android系统的我们是一个不轻松的任务。
三. 实验整体架构:
在这个骰子游戏的构造中,共定义了两个包:
1. src文件夹下的com.macrocheng.cubeopengl:
(1) GLTutorialBase类;
(2) GLTutorialCube类;
(3) MainActivity类;
(4) ViewAnimator类;
2. gen文件夹下的com.macrocheng.cubeopengl:
(1) BuildConfig类;
(2) R类;
这两个包及类中的关系可以用UML类图表示如下:
GLTutorialBase类:
该类作为GLTutorialCube的父类,继承了SurfaceView类,并实现了SurfaceHolder.Callback和Runnable接口,根据资料可知其中接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息,而Runnable接口用来实现多线程。而类中的方法可以在类图中看到,而每个类的方法的作用,在源程序中均有备注,此处不再赘述。
GLTutorialCube类:
该类继承了GLTutorialBase类,本次实验的关键代码就在于此。类中设置了环境光和漫反射光的数组作为照明模型,分别用matAmbient和matDiffuse两个数组表示。用一个二维数组box来构建在空间坐标系的正方体骰子,骰子有6个面,用6个二维数组元素表示,每个面用面的4个顶点表示,顶点则是用x,y,z三个坐标表示。但在手机屏幕上只有x,y两个坐标系,所以用二维数组texCoodrs来记录六个面在屏幕上的分布情况,同样6个面,每个面用4个点表示,每个点用x,y表示。用位图数组来记录六个面的图片。而后初始化游戏界面。
下面重点介绍关于旋转,平移,缩放的代码部分:
首先用一下代码来重定位坐标系:
旋转:
使用opengl的方法glRatatef()来控制x,y方向上的旋转:
其中xrot和yrot是在x,y上的旋转角,之所以取负,是因为这样才可以保持旋转方向和手势方向一致。Xrot和yrot由以下代码计算:
平移:
使用glopengl的glTranslated( )方法实现平移:
其中distance表示在x,y方向上的偏移量,distance的计算如下:
_x,_y是在之前手指触摸到屏幕时就记录下的坐标点,当手指移动一定距离后使用event.getX( )和event.getY( )来获得当前手指所在位置坐标,然后取二者之差,即可得到偏移量。
放缩:
使用glopengl的glScalef( )方法实现放缩:
其中num表示在x,y方向上的放缩倍数,num的计算如下:
其中oldDist表示在手指移动前,两手指间的距离;而newDist表示在手指移动后两手指间的距离,所以两距离的比值可以用作放缩倍数。
至于屏幕上有几个手指触摸屏幕可以用变量mode来计数和判断:
MainActivity类:
继承自Activity类,并重写了Activity中的方法onCreate(),启动服务时将会调用onCreate()方法,创建了GLTutorialCube类对象,来开启主要活动。
ViewAnimator类:
继承自Handler类,可以使用其invalidate()来实现view的重绘,关于animation的介绍如下:
使用start()和stop()来现实对animation的启动与关闭。
Handler是Message的主要处理者,负责将Message添加到消息队列以及对消息队列中的Message进行处理。
BuildConfig类:
新增了一个特性,允许开发者只在Debug模式下运行部分代码。Builds会生成一个叫做BuildConfig的类,该类包含一个名为DEBUG的常量,其常量值会依据开发者的Build类型自动设定。如此,便可以利用BuildConfig.DEBUG来实现只在Debug模式下运行的代码。
R类:
定义了游戏中要用到的骰子的六个图标和游戏图标以及布局管理器和串设置:
下面简单展示运行界面:
五.实验小结:
本次实验虽然并不困难,但诚如前面所言,因为对android系统缺乏了解,所以很多知识都需要从头整理,并在网上查阅了大量资料,在此感谢网上热心的网友提供的帮助。开始对各类间的关系很不清楚,后来参考了去年的面向对象的课程设计,忽然想到可以使用UML建模,这样就可以直观的得到几个类间的关系。在网上参考了一个网友的建议,原本在src下又建了一个包zoom,其中有一个zoomListener,这样可以给GLTutorialCube的点击事件添加监听器,但是程序没办法运行。后来与同学讨论,关键在于重写onTouchEvent( ),但是既然在重写放缩时有用mode==2判断两指事件,那么也可以用mode==1来判断一指触摸时的旋转,所以不必重写,直接添加就好。但在传参时不小心沿用了网友给出的模板onTouchEvent(View view,MotionEvent event)导致没有结果。后来将view参数删去,得到了最终想要的结果。
实验中的参考网址:
http://www.android-study.net/listxx.aspx?id=591
http://www.cnblogs.com/monodin/archive/2013/06/19/3144204.html
http://www.cnblogs.com/qingblog/archive/2012/06/27/2566021.html
http://www.cnblogs.com/qingblog/archive/2012/06/27/2566021.html
http://wenku.baidu.com/view/a4f5748fcc22bcd126ff0c1a.html
http://wenku.baidu.com/view/1bbeae73f46527d3240ce05c.html
http://blog.csdn.net/shaojie519/article/details/6725570
http://www.cnblogs.com/devinzhang/archive/2012/08/31/2665705.html
http://www.eoeandroid.com/thread-71484-1-1.html
第二篇:人机交互实验报告2
课程实验报告
专业年级 计算机科学与技术
课程名称 人机交互
指导教师
学生姓名
学 号
实验日期
实验地点
实验成绩
教务处制
二OO 年 月 日
注:可根据实际情况加页