09-10秋学期网络工程大作业

来源:百度文库 编辑:神马文学网 时间:2024/03/29 07:29:38

前言:今年的探究式作业很多组都做得很好,成效显著,由于文件太大,这篇网页摘录了部分,全部可点击进入

09-10秋学期网络工程大作业

 

基于Google android 平台上的

软件设计研究

 

 

 

 

 

作者(学号) 买日达江(1071000095)

作者(学号) 阿姨仙古(1071000065)

作者(学号) 哈拉哈市 (1071000302)

 

 

 

 

 

中文摘要

 

Android是一个针对移动设备的程序集,。其中包括一个操作系统, 一个中间件和一些关键性应用.本文首先介绍Androit 平台和它的发展历史,概览了Android SDK提供的工具和APIs, 当您在使用Java语言来开发Android平台的应用时您会用到它们。然后介绍基于windows操作系统的开发环境然后介绍,最后通过实例介绍基于该平台的软件设计的原理和开发过程。

 

 

关键词

 

   Android     Android SDK     Java     windows操作系统 APIs。

 

 

 

 

 


第一章  认识Android

 

1.1 什么是Android

 

在可见的将来,基于Android 平台的手机程式设计,将像今日的PC 程式设计一样普及。

「Android」是一个基于Linux 核心(kernel)的开放手机平台作业系统。与Windows Mobile、Symbian 等手机作业系统处在同一级别。

对于设备制造商来说,「Android」是一个免费的平台。「Android」作业系统让设备制造商免除「每出一台手机,就得被手机作业系统厂商(如MicroSoft)收取费用」的情况。

对硬体开发厂商来说,「Android」也是个开放的平台。只要厂商有能力,可以在这个平台上自由加入特有的装置或功能,不受手机作业系统厂商的限制。

对于手持装置的开发者来说,「Android」是个先进的平台。平台上的应用程式可相容于各种型号的Android 手机,免去为各种不同手机机型开发的困扰。「Android」平台支援各种先进的网路、绘图、3D 处理能力,可以用来提供更好的使用者体验。

对于使用者来说,「Android」是一个用于手机的作业系统。使用者只要先申请一个免费的Google 帐户,当使用者想换一台手机时,就可以在不同厂牌,同样使用「Android」作业系统平台的手机之间选择,并且很容易地将如联络簿等个人资料转换到新手机上。

Android 在Linux 核心的基础上,提供了各种合用的函式库,和一个完整的应用程式框架。并采用较符合商用限制的Apache 版权。在Linux 核心的基础上提供Google 自制的应用程式运行环境(称作Dalvik,与Sun 的J2ME 不同),并提供基于Eclipse 整合开发环境(IDE)的免费、跨平台(Windows、Mac OS X、Linux) 开发工具(SDK),便于应用程式开发者学习、使用。

免费、熟悉的跨平台开发工具,让具备一些物件导向观念,或视窗程式开发经验的开发者,能在一定时间内上手。1000 万美元的大奖赛则提供了足够的诱因,让第一支Android 手机正式面市前,就拥有了各式各样的应用程式可供使用。

 

从不同角度来说,Android 代表着

一个崭新的开放原始码作业系统平台、

一个友善的免费应用程式开发环境、

一个与世界各地的程式开发者,站在相同起跑点上的公平竞争机会。

 


1.2 android的发展历史

 

 

 

 

2007 年11 月5 日,Google 与其他33 家手机制造商(包含摩托罗拉、宏达电、三星、LG)、手机晶片供应商、软硬体供应商、电信业者所联合组成的开放手持装置联盟(Open HandsetAlliance),发布了名为「Android」的开放手机软硬体平台。参与开放手持装置联盟的这些厂商,都会基于Android 平台,来开发新的手机业务。

 

紧接着,在Android 平台公布的一周之后(11 月12 日),Google 随即发布了可以免费自由下载,能在Windows、Mac OS X 、Linux 多平台上使用的Android 软体开发工具(SoftwareDevelopment Kit, SDK)与相关文件。间隔数天,又再次发布作业系统核心(kernel),与部分驱动程式的原始码。一歩歩展示Google 欲将手机这个现代人的随身工具推往开放平台,让人们可以自由修改创作出符合自己需求的手机应用的决心。

 

身为Google 公司创办人之一的Sergey Brin,也在Android 软体开发工具(SDK)发布的同时,现身于视讯广告影片中,为大众介绍Android 平台。Sergey Brin 也同时宣布举办总奖金高达1000 万美元(3 亿多台币)的开发者大奖赛,鼓励程式开发者去深入探究Android 平台的能力。写出具创意、实用性十足、能提供使用者更好的手机使用经验的应用程式。

 

2008 年9 月24 日,T-Mobile 首度公布第一台Android 手机(G1)的细节,同日Google 也释出了Andorid SDK 1.0 rc1。对应用程式开发者而言, 1.0 代表了开发者可以放心地使用API,而不必再担心API 有太大的变动。G1 在同年10 月20 正式发售。在发售前仅针对原T-Mobile用户的预购活动中,已经被预购了150 万台。在10/21 日,Open Handset Alliance 公开了全部Android 的原始码。从此,开发者拥有了一个完全开放的手机平台。

 

 

目前有15 亿使用者可以透过电脑,在网路上看到Google 广告。

若手机使用者也能上网,其潜在使用者则可以达到30 亿。

 

 

 

 

 

 

 

        第二章 Android开发环境搭建

 

2.1开发环境的搭建

 

编写Android 的应用程式,需要一套个人电脑系统。至于作业系统的部份,几个主流作业系

统都有支援。

支援的作业系统如下:

Windows XP 或Vista

Mac OS X 10.4.8 或之后版本(适用x86 架构的Intel Mac)

Linux(官方于Ubuntu 6.10 Dapper Drake 上测试)

我们需要安装一些Android 开发环境所需的程式工具,这些工具都是可以免费上网取得的:

JDK5.0或者JDK6.0,Eclipse IDE,Andoid SDK,ADT。

本文使用的是 windows xp SP3,JDK6.0, Eclipse 3.4,Android SDK 2.0 和 ADT  0.9.4

1.安装JDK

  双击JDK安装文件后打开安装向导,接受许可证如图 2.1所示。

             

 

图2.1 接受许可                                   图2.2 选择组件和安装路径

选择要安装的的组建和安装的路径如入2.2所示。然后单击“下一步”按钮,就可以自动完成安装,这里不做详细描述,最后检查一下是否安装成功。

 

 单击“开始”,选择“运行”,在出现的对话框中输入CMD命令,打开CMD窗口,在CMD窗口中输入JAVA –VERSION,如果屏幕出现如图2.3一样的代码信息,说明JDK安装成功了;

                                   图 2.3 检查jdk

 

 2 .安装Eclipse

安装好JDK 以后就可以安装Eclipse 了 ,打开Eclipse下载页面,具体网址http://www.eclipse.org/downloads/.

 下载完成后,找到下载的压缩包解压此压缩文件就可以用不用安装,不过一定要先安装JDK。

进入解压后的目录,就可以看到一个名为“eclipse。exe”的可执行文件,双击此文件直接运行,eclipse 能自动找到用户先期安装的JDK路径。

 如果用户第一次安装,启动eclipse,将会看到选择工作空间的提示,如图2.4所示。

 

选择工作空间路径,然后单击“OK”

按钮,至此,JDK和Eclipse已经安装完毕。

 

 

 

 

 

 

图 2.4 选择工作空间

3.安装ADT

Android 为Eclipse 提供了一个插件,即Android Development tools(ADT),目的是为用户提供一个强大的综合环境用于开发android应用程序,ADT扩展了Eclipse的功能,可以让用户快速地建立Android项目,创建应用程序界面,在基于Android框架API的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名的APKS以及便发行应用程序。

 安装Android Development Tools plug-in 打开 Eclispe IDE,依次单击 Menue项中的Help--->Install New Software。。如图2.5所示。

 图 2.5 Install New Software界面

 在弹出的对话框中,选择“Available Software”标签。单击“Add。。“按钮如图2。6所示。

 

                              图2.6Add 界面

弹出如图2.7界面是选择“Archive“按钮,然后找到ADT插件,会出现图2.7中的location里面的文字,然后单击OK。

出现如图2.8中的界面是选择“androidDevalopment tolls”和“Android

图2.7 ADD SITE界面

DDMS“,单击“next”进入安装界面然后单击“install”按钮开始安装,安装完毕后提示重启Eclispe如图2.9所示。单击OK

重启eclipse。

 

                      图2.8可用的插件

                       图 2.9重启Eclipse界面

4.安装 Android SDK

  首先打开Android开发者社区,对应的网址为http://developer.android.com 。 转到SDK下载页面下载Android SDK 最新版本为2.0。

启动Eclispe 在windows 菜单里面出现了一个如图2.10一样的androd sdk and avd maneger菜单项。

 

                    图 2.10 androd sdk and avd maneger

单击androd sdk and avd maneger然后 弹出Andoid SDK AVD Maneger界面,在Available Package中选择全部然后单击“Install Selected”按钮安装Android SDK;

                             图 2.11Android SDK and AVD maneger界面

 

5.设定 Android SDK Home

 安装完插件和SDK后还要做如下配置才可以使用Eclispe创建Android项目,需要设计Andoid SDK主目录。依次单击“windows-àperformance”项如入图2.12所示。

                             图 2.12 单击“performance”界面

在弹出的界面左侧可以看到“Android”项,选中Androi以后,在右侧设定AndroidSDK所在的目录为 SDK Location,单击OK按钮完成安装,如图2.13所示。

                               图2.13 设置SDK路径界面

 

2.2 创建模拟器

  在Android SDK1.5以后的版本中,必须创建至少一个AVD,AVD的全称为Android 虚拟设备(Android Virtual Device),每个AVD模拟了一套虚拟设备来运行Android 平台,这个平台至少要有自己的内核,系统图像和数据分区,还可以有自己的SDK卡和用户数据以及外观显示等。

 创建模拟器方法如下:

    打开Eclispe 在windows->Android SDK and AVD Manager 界面,里面选择Virtual Device 选卡 然后按“New”按钮如下图2.14所示

 

                               图2.14 创建模拟器界面

 

出现如图2.15所示的界面是在Name 里面选择虚拟器名称可以使随意,然后在Target 里面选择模拟器版本,然后SD Card里面输入AD Card的大小,然后选择要支持的硬件比如蓝牙,存储卡,等等。

然后按Create AVD 按钮来完成模拟器的创建。

创建模拟器后会出现如下12.16所示的界面里面展示已经创建的模拟器的名称。选择模拟器后单击 start 按钮运行模拟器。

             图 12.15 模拟器选项界面

                               图 12.16创建模拟器运行界面。

 每次运行模拟器的时候先出现如下图12.17所示的选择界面,选择屏幕大小还有显示器大小以后单击 Launch按钮确定。

     图12.17 模拟器选择界面

 

                                                   图12.18 模拟器界面

 

 

 

 当启动模拟器的时候会出现12.18所示的界面。这个是正在启动的界面这个会需要一两分钟的比较长的时间。当模拟器完全启动的时候会出现图12.19所示的界面。

 

 

                           图12.19完全启动的模拟器界面

 

 

 目前为止我们完全安装完了Android SDK开发环境到时候要测试我们的环境的时候了。

 

2.3测试Android开发环境

  开发环境搭配完成,下面需要新建一个项目来验证开发环境是否可以正常工作,依次选择FileàNew—>Other项,如图12.20所示。

               图 12.20 新建项目选择界面。

 

 

  在弹出的对话框中选择AndroidàAndroid Project然后单击Next 进入创建项目界面如图12.21所示。

                                图12.21选择项目界面

 

 

 

 

在弹出的界面了输入项目名称,应用程序名称,包名称注意 包的名称是用一个或多个点分开名称,然后是Activity名称就是界面名称,然后是SDK版本,2表示1.1版本 ,3表示1.5版本 ,4表示1.6版本5表示2.0版本然后单击finish完成创建项目。如图12.22所示

 

 

 

 

 

                 图12.22 输入创建项目名称界面

 

  打开RunàRun Configuurations 进入选择模拟器界面如图12.23所示选择我们创建的项目要运行的模拟器以后单击Run 按钮运行项目。运行结果如图12.24所示如果出现图12.24所示的结果表明环境搭配成功否则请检查环境。

                         图12.23 选择模拟器界面

                               图12.24 运行结果

  至此,在Windows平台上的开发环境搭建完成,安装了JDK,Eclispe ,ADT,Android SDK

并进行了SDK Home的配置,创建了一个Android 虚拟设备AVD。

 

 

第三章 Android SDK介绍

 

3.1Android SDK基础

  Android SDK (Software Development kit)提供了在windows/inux/mac 平台上开发Android 应用的开发组件,也就是说,不论读者用什么样的平台都可以开发出Android 应用软件,其包含了在Android 平台上开发移动应用的各种工具集。它不仅包含了Android模拟器和用于Eclipse的Android开发工具插件,而且包括了各种用来调试,打包何在模拟器上安装应用工具。

  Android SDK 主要以java 语言为基础。用户可以使用java 语言来开发Android平台上的软件应用。通过SDK提供的一些工具将其打包成android平台应用的apk文件,然后在使用SDK中的模拟器来模拟和测试该软件在Android平台上运行情况和效果。

 

 3.2Android SDK目录结构

  首先来看下SDK的目录结构,这有助于从全局把握SDK,为后面的深入学习打下好基础。

  新的Android 2.0版本SDK目录结构和以前版本有着较大的区别。首先需要说明的是,Android 1.5版本的SDK增加了对多版本平台的支持,在platforms下可以看到,其中包含android 1.1和android1.2也就是说Android 1.5版本的SDK可以前容以前的1.1版本。

  另外dd-ons 目录下的google-apis-3是Google提供的API包,其中主要是Google Map的API,documentation。Html和docs目录下的是文档;RELEASE_NOTES。Html是SDK的发布说明;usb-driver目录下包含了amd64和x86下的驱动文件;tools目录下包含一些通用的工具文件。

 Platforms目录下针对每个版本的SDK版本提供了其相对应的API包以及一些实例文件,这里主要列举了android 1.5文件夹下的内容,其中android。Jar是包含全部API的压缩包,samples 目录下SDK附加的一些例子;skins目录下包含其支持的几种外观样式,如HVGA(default),HVGA-L,HVGA-P,QVGA-P,QVGA-P;templates目录下是一些常用的文件模板;tools目录下是一些非常实用的工具和辅助工具。

 3.3 ndroi.jar及内部结构

 

Android.jar是一个标准的压缩包,其中包含的是编译后的class文件,包含了全部的API,我们使用Windows系统的压缩工具winrar打开此压缩文件,可以看到内部架构如图3.1和3.2所示。

 

 

 

                图3.1 a ndroid.jar结构

 

                      图3.2内部的class文件

 

从上面的两张图可以了解API的包结构的划分,如app,content,database,graphics,hardware等,也就是大致了解了其模块的划分结构,有了这种印象,有助于我们阅读和查阅SDK文档。

3.4 SDK文档

 通过解压android.jar文件,大致了解了其内部的API的包结构和组织方式,如果想深入的了解各个文件包内包含的API以及每个API的用法,那我们必须阅读和查找SDK文档,实用IE浏览器打开SDK目录下的documentation.html文件可以看到如图3.3所示的界面。

                        3.4SDK文档首页

 

 

第四章 Android应用程序结构介绍

4.1Android体系结构介绍

 Android作为移动设备的开发平台,其软件层次结构包括了一个操作系统(0S),中间件和应用程序。Android的软件框如图4.1所示其软件层次结构自上而下可以分为一下几个层。

                           图4.1Android系统架构

 

 

应用程序(Application);

应用程序框架(Applicaion Framework);

各种库(Libraries)和Android运行环境(RunTime);

Linux 内核;

1.      应用程序

Android 会同一系列核心应用程序包一起发布,该应用程序包包括email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA 语言编写的。

2.      应用程序框架

开发人员也可以完全访问核心应用程序所使用的API 框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

隐藏在每个应用后面的是一系列的服务和系统, 其中包括;

• 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids), 文本框(text boxes),按钮( buttons), 甚至可嵌入的web 浏览器。

• 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据

• 资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件( layoutfiles )。

• 通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。

• 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

3.      各种库和Android运行环境

 Android 包含一些C/C++库,这些库能被Android 系统中不同的组件使用。它们通过Android 应用程序框架为开发者提供服务。以下是一些核心库:

• 系统C 库- 一个从BSD 继承来的标准C 系统函数库( libc ), 它是专门为基于embedded linux的设备定制的。

• 媒体库- 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

• SurfaceManager - 对显示子系统的管理,并且为多个应用程序提供了2D和3D 图层的无缝融合。

• LibWebCore - 一个最新的web 浏览器引擎用,支持Android 浏览器和一个可嵌入的web 视图。

• SGL - 底层的2D图形引擎

• 3D libraries - 基于OpenGL ES 1.0 APIs 实现;该库可以使用硬件3D 加速(如果可用)或者使用高度优化的3D 软加速。

• FreeType -位图(bitmap)和矢量(vector)字体显示。

• SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

Android 运行库

Android 包括了一个核心库,该核心库提供了JAVA 编程语言核心库的大多数功能。每一个Android 应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik 虚拟机实例。Dalvik 被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik 虚拟机执行(.dex)的Dalvik 可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA 编译器编译,然后通过SDK中的"dx" 工具转化成.dex 格式由虚拟机执行。Dalvik 虚拟机依赖于linux 内核的一些功能,比如线程机制和底层内存管理机制。

4.linux内核

Android 的核心系统服务依赖于Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。Linux 内核也同时作为硬件和软件栈之间的抽象层。

4.2Android应用程序组成

 一般来说Android主要有下列4部分组成,它们分别是:

1.      Activity

Activity可以算是开发者遇到的最频繁的,也是Android当中最基本的模块之一。在Android的程序当中,Activity一般代表手机的屏幕的一屏。如果把手机比做一个浏览器,那么Activity就相当于一个网页,在Activity当中我们可以添加一些View,并且可以对这些View做一些事件的处理。一般一个Android应用是由多个Activity组成的,这多个Activity之间可以进行相互跳转,例如,按一个Button按钮后,可能跳转到其他的Activity。Activity之间的跳转可能有返回值。

 当打开一个新的屏幕时,之前一个屏幕被设置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。

2.      Intent和Intent Filters

Intent在Android应用中是相当重要的。一个Intent就是一次对将要执行的操作的抽象描述。Intent作用有三种。通过Intent我们可以做多个Activity之间进行跳转。下边是实现Activity跳转代码,我们大概看一下在这里假设有两个Activity,一个是ActivityA,另一个是ActivityB,代码如下所示:

   Intent in=new Intent(A.this,B.class);

   startActivity(in);

通过执行这两句代码,就可以实现从ActivityA跳转到ActivityB.

通过broadcast intent机制可以将一个Intent 发送给任何对这个Intent感兴趣的BroadcastReceiver。

通过startService(Intent)或bindService(Intent,ServiceConnection,int)来和后台的Service进行交互。

与Intent有关系的一个类叫做Intent Filters。如果说Intent 是一个有效请求,一个Intent Filters则用于描述一个Activity能够操作那些Intent。一个Activity如果要显示一个人的联系方式时,需要声明一个Intent Filters,这个Intent Filters要知道怎么样去处理VIEW动作和表示一个人的URI。Intent Filters一般在AndroidManifest。Xml中定义。

3.      Broadcast Intent Receiver

可以实用BroadcastReceiver 来让应用对一个外部事件做出响应。这是非常有意思,例如电话呼入这个外部事件到来的时候,可以利用BroadcastReceriver进行处理。例如当下载一个程序成功的时候仍然可以利用BroadcastReceiver进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager来通知用户这些事情。BroadcastReceriver既可以在AndroidManifest。Xml中注册,也可以在运行时代码中实用Context。RegisterReceiver()进行注册。只要是注册了,当时间来的时候,即使程序没有启动,系统会在需要的时候启动程序。各种应用还可以在使用Context。SendBroadcast()将它们自己的intent Broadcast广播给其他应用程序。

4.      Service

      Service是一种程序,它可以运行很长的时间,但是它却没有用户界面。比如说打开一个音乐播放器的程序,这和时候若想上网了,那么 我们打开Android浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲的播放器并没有停止,而是在后台连续的播放。当然这个播放音乐的Service也可以停止。通过startService(Intent service)来启动一个sevice,通过Context.bindService()可以绑定一个Service,stopService(Intent serivice)来停止一个service。

5.      Content Provider

Android系统中数据是私有的,当然这些数据包括文件数据和数据库数据,以及一些其他类型的数据。一个Content Provider实现了一组标准的方法接口,从而能够其他的应用保存或读取词Content Provider的各种数据类型。

一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界可以通过一套标准而统一的接口和程序里的数据打交道,可以读取数据,也可以删除数据。下边列举一些叫常见的接口。

query(uri,string[],string,string[],string);通过关键子查询数据。

Insert(Uri,ContentValues);将一组数据插入到指定的地方。

Update(Uri,ContentValues,String,String[]);更新数据。

Delete(Uri,String,String[]);删除数据。

 

4.3Android应用工程文件组成

   现在我们看一个典型的工程文件是什么样子的,如图4.2所示。

我们大致的了解一下项目里边的每一部分构成。

 

源文件(包含Activity)。源文件都在上边的src目录中,在上边只有一个HelloWorld.java。

 

Rjava文件。这和文件是Eclispe自动生成的,应用开发者不需要去修改它,里边内容的修改也是Eclipse自动来处理。R文件对与应用开发这来说基本上没有用,但是对Android系统来说非常有用。在这个文件中,Android对下边即将介绍的资源进行了全局索引。在下边的res文件夹中,内容发生变化是R。java都会重新编译,同步更新。

 

 

 

AndroidLibrary 这个是应用运行的Android库。图4.2所示的项目用的是Android2.0.1的库。

  assets目录。这个目录里主要放置多媒体等一些文件。

  res目录。这个目录放置应用程序用到的资源文件。里面分五个目录进行存放当过这个 目录中的资源文件发生变化时R文件页发生变化。

Drawable目录。这个目录主要放置图片资源。

Layout目录。这个目录主要放置布局文件这些布局文件都是XML文件。

Values目录。这个目录主要放置字符串,颜色,数组。

AndroidManifestXml。这个文件相当重要,应用所用到的Activity,

图4.2HelloWorld工程文件结构

 

Service,以及receiver等。

 

第五章 Android基本组件介绍

5.1视图组件(View

  在Android当中View里边是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的,例如Textview以及Button(按钮),List(列表),EditText(文本框),RadioButton(多选按钮),Checkbox(选择框)等都是View类.

  一个View在屏幕上占据了一块矩形区域,他负责渲染这块矩形区域,也可以处理这块矩形区域发生的事件,并且可以设置这块区域是否可见,是否可以获取焦点等。

52视图容器组件(Veiwgroup

 一个Viewgroup对象是一个Android。View。viewgroup的实例。就像它的名字显示的意思一样,它的作用就是View的容器,它负责对添加进Viewgroup的这些View进行布局。当然一个Viwgroup也可以加入到另一个Veiwgroup里边,因为Viewgroup也是继承于View。Viewgroup类,他是一个抽象类,也是其他容器类的基类。

5.3布局组件(layout

Viewgroup的实现类比较多,在这里介绍最常用的两个实现类。一个是LinearLyout,他可以进行水平布局或者竖直布局。如果LinearLyout的布局方向设置为vertical那么表明是竖直布局。也就是说先加入进去的View会显示在顶端,后加入的View会显示在底端,如果设置为horizontal那表明是水平布局,也就是从左到右依次进行列布局。

 RelativeLayout负责相对布局,用过Css编程的用户应该知道,在Css中经常会用到相对布局,例如,设置A显示在B的左侧,那么B的显示坐相对于A的位置。

5.4布局参数(LayoutParams

  一个view加入到一个Viewgroup里边,例如加入到RelativeLayout里边,那么他在这个RelativeLayout里边怎么样显示的呢?里边?左边?右边?还是上边?在将每一个View加入到这个RelativeLayout里边的时候,我们会传递一组值(如果没有传递值,系统会用默认值)这组值封装在LayoutParams这个类当中。在显示这个View的时候它的容器会根据传进来的LayoutParams进行计算,来确认这个View显示的大小和位置。

 

 第六章 Android实例:登陆月球

在这章我们用经典游戏登陆月球来介绍怎么样开发一个Android应用程序。

 

 登陆月球的游戏操作很简单,按向上键来开始游戏,使用手机中的箭头键来挑调整航天飞机的降落方向,然后按中间的空白键来减速喷射引擎。最后

在画有一条路线的月球表面就算成功。如上面得图所示。画面最左角的路线是燃料,中间的绿色长条是速度,当中间的绿色长条变浅绿色就代表速度太快乐,必须按空白键一减速,这样才不会失速摧毁。

了解登月游戏后,现在看看它的源代码是如何让编写的?

 首先打开LunarLander.java主程序源代码可以看到源代码由声明LunarLander为Activity的子类开始,然后定义游戏菜单模式有难度设置,如EASY,HARD,或MEDIUM,还有暂停,连续,开始与停止的选项,其中最重要的是LunarThread声明mLunarThread为member family变量用来控制图像文件,LunarView则是实用mLunarView来控制游戏的显示功能。

ublic class LunarLander extends Activity {

    private static final int MENU_EASY = 1;

 

    private static final int MENU_HARD = 2;

 

    private static final int MENU_MEDIUM = 3;

 

    private static final int MENU_PAUSE = 4;

 

    private static final int MENU_RESUME = 5;

 

    private static final int MENU_START = 6;

 

    private static final int MENU_STOP = 7;

 

  

    private LunarThread mLunarThread;

    private LunarView mLunarView;

 

。。。。。。。。

}

然后在源代码使用onCreateOptionMenu()与onOptionItemSelected()函数来控制游戏的菜单,以及onCreate()创建Activity,并采用onPause()与onSaveInstanceState()来控制词游戏的Activi生命周期。

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

 

        menu.add(0, MENU_START, 0, R.string.menu_start);

        menu.add(0, MENU_STOP, 0, R.string.menu_stop);

        menu.add(0, MENU_PAUSE, 0, R.string.menu_pause);

        menu.add(0, MENU_RESUME, 0, R.string.menu_resume);

        menu.add(0, MENU_EASY, 0, R.string.menu_easy);

        menu.add(0, MENU_MEDIUM, 0, R.string.menu_medium);

        menu.add(0, MENU_HARD, 0, R.string.menu_hard);

 

        return true;

    }

   @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case MENU_START:

                mLunarThread.doStart();

                return true;

            case MENU_STOP:

                mLunarThread.setState(LunarThread.STATE_LOSE,

                        getText(R.string.message_stopped));

                return true;

            case MENU_PAUSE:

                mLunarThread.pause();

                return true;

            case MENU_RESUME:

                mLunarThread.unpause();

                return true;

            case MENU_EASY:

                mLunarThread.setDifficulty(LunarThread.DIFFICULTY_EASY);

                return true;

            case MENU_MEDIUM:

                mLunarThread.setDifficulty(LunarThread.DIFFICULTY_MEDIUM);

                return true;

            case MENU_HARD:

                mLunarThread.setDifficulty(LunarThread.DIFFICULTY_HARD);

                return true;

        }

 

   @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

 

        // turn off the window's title bar

        requestWindowFeature(Window.FEATURE_NO_TITLE);

 

        // tell system to use the layout defined in our XML file

        setContentView(R.layout.lunar_layout);

 

        // get handles to the LunarView from XML, and its LunarThread

        mLunarView = (LunarView) findViewById(R.id.lunar);

        mLunarThread = mLunarView.getThread();

 

        // give the LunarView a handle to the TextView used for messages

        mLunarView.setTextView((TextView) findViewById(R.id.text));

 

        if (savedInstanceState == null) {

            // we were just launched: set up a new game

            mLunarThread.setState(LunarThread.STATE_READY);

            Log.w(this.getClass().getName(), "SIS is null");

        } else {

            // we are being restored: resume a previous game

            mLunarThread.restoreState(savedInstanceState);

            Log.w(this.getClass().getName(), "SIS is nonnull");

        }

    }

    protected void onPause() {

        super.onPause();

        mLunarView.getThread().pause(); // pause game when Activity pauses

    }

 

   protected void onSaveInstanceState(Bundle outState) {

        // just have the View's thread save its state into our Bundle

        super.onSaveInstanceState(outState);

        mLunarThread.saveState(outState);

        Log.w(this.getClass().getName(), "SIS called");

    }

}

 

然而LunarLander游戏的重点在第二个源代码LunarView.java中,航天飞机的所有动作都在此代码中操作,主要有导入android。Graphics。drawable。Drawable类的draw()函数负责航天飞机动画绘制,而invalidate()函数则会重新调用draw()函数,以不断绘制航天飞机图标到达航天飞机降落的效果,并且将画面的左下角当做坐标(0,0),记录航天飞机的x,y,dx,dy坐标位置,整个绘制的源代码定义在LunarThread()函数中。

public LunarThread(SurfaceHolder surfaceHolder, Context context,

                Handler handler) {

            // get handles to some important objects

            mSurfaceHolder = surfaceHolder;

            mHandler = handler;

            mContext = context;

 

            Resources res = context.getResources();

            // cache handles to our key sprites & other drawables

            mLanderImage = context.getResources().getDrawable(

                    R.drawable.lander_plain);

            mFiringImage = context.getResources().getDrawable(

                    R.drawable.lander_firing);

            mCrashedImage = context.getResources().getDrawable(

                    R.drawable.lander_crashed);

 

            // load background image as a Bitmap instead of a Drawable b/c

            // we don't need to transform it and it's faster to draw this way

            mBackgroundImage = BitmapFactory.decodeResource(res,

                    R.drawable.earthrise);

 

            // Use the regular lander image as the model size for all sprites

            mLanderWidth = mLanderImage.getIntrinsicWidth();

            mLanderHeight = mLanderImage.getIntrinsicHeight();

 

            // Initialize paints for speedometer

            mLinePaint = new Paint();

            mLinePaint.setAntiAlias(true);

            mLinePaint.setARGB(255, 0, 255, 0);

 

            mLinePaintBad = new Paint();

            mLinePaintBad.setAntiAlias(true);

            mLinePaintBad.setARGB(255, 120, 180, 0);

 

            mScratchRect = new RectF(0, 0, 0, 0);

 

            mWinsInARow = 0;

            mDifficulty = DIFFICULTY_MEDIUM;

 

            // initial show-up of lander (not yet playing)

            mX = mLanderWidth;

            mY = mLanderHeight * 2;

            mFuel = PHYS_FUEL_INIT;

            mDX = 0;

            mDY = 0;

            mHeading = 0;

            mEngineFiring = true;

        }

 

  LunarView.java源代码中使用content。getResource()函数取得绘制各式各样的航天飞机样式的图案,然后使用getDrawable()函数绘制航天飞机降落,升空的图案,并采用BitmapFactory。DecoderResource()函数装入会有地球/月球的游戏背景图案,使用Paint()函数绘制绿色燃料与速度长条。

 该游戏的难易度设置源代码也在LunarView。Java这个文件中。游戏一开始的难易度默认为Medium模式,如果改为EASY模式,测燃料量增加为3/2,着地露出色长条变为4/3,下降速度测调为Medium的3/2倍速也不会毁灭。反之若调为HARD模式测燃料量变少,着地线变短,着地速度页也要变慢。开发者自行条整源代码以设置游戏的难易度。

public void doStart() {

            synchronized (mSurfaceHolder) {

                // First set the game for Medium difficulty

                mFuel = PHYS_FUEL_INIT;

                mEngineFiring = false;

                mGoalWidth = (int) (mLanderWidth * TARGET_WIDTH);

                mGoalSpeed = TARGET_SPEED;

                mGoalAngle = TARGET_ANGLE;

                int speedInit = PHYS_SPEED_INIT;

 

                // Adjust difficulty params for EASY/HARD

                if (mDifficulty == DIFFICULTY_EASY) {

                    mFuel = mFuel * 3 / 2;

                    mGoalWidth = mGoalWidth * 4 / 3;

                    mGoalSpeed = mGoalSpeed * 3 / 2;

                    mGoalAngle = mGoalAngle * 4 / 3;

                    speedInit = speedInit * 3 / 4;

                } else if (mDifficulty == DIFFICULTY_HARD) {

                    mFuel = mFuel * 7 / 8;

                    mGoalWidth = mGoalWidth * 3 / 4;

                    mGoalSpeed = mGoalSpeed * 7 / 8;

                    speedInit = speedInit * 4 / 3;

                }

 

最后游戏还要编写控制键盘源代码,让玩家可以通过箭头键盘操作这款游戏。这样的源代码有dokeyDown()与doKeyUp()函数控制键盘动作。到此位置我们基本上完成Android游戏设计了,包括游戏菜单设置,游戏画面绘制,难易度设置与键盘控制。

      boolean doKeyDown(int keyCode, KeyEvent msg) {

            synchronized (mSurfaceHolder) {

                boolean okStart = false;

                if (keyCode == KeyEvent.KEYCODE_DPAD_UP) okStart = true;

                if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) okStart = true;

                if (keyCode == KeyEvent.KEYCODE_S) okStart = true;

 

                boolean center = (keyCode == KeyEvent.KEYCODE_DPAD_UP);

 

                if (okStart

                        && (mMode == STATE_READY || mMode == STATE_LOSE || mMode == STATE_WIN)) {

                    // ready-to-start -> start

                    doStart();

                    return true;

                } else if (mMode == STATE_PAUSE && okStart) {

                    // paused -> running

                    unpause();

                    return true;

                } else if (mMode == STATE_RUNNING) {

                    // center/space -> fire

                    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER

                            || keyCode == KeyEvent.KEYCODE_SPACE) {

                        setFiring(true);

                        return true;

                        // left/q -> left

                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT

                            || keyCode == KeyEvent.KEYCODE_Q) {

                        mRotating = -1;

                        return true;

                        // right/w -> right

                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT

                            || keyCode == KeyEvent.KEYCODE_W) {

                        mRotating = 1;

                        return true;

                        // up -> pause

                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

                        pause();

                        return true;

                    }

                }

 

                return false;

            }

        }

 

boolean doKeyUp(int keyCode, KeyEvent msg) {

            boolean handled = false;

 

            synchronized (mSurfaceHolder) {

                if (mMode == STATE_RUNNING) {

                    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER

                            || keyCode == KeyEvent.KEYCODE_SPACE) {

                        setFiring(false);

                        handled = true;

                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT

                            || keyCode == KeyEvent.KEYCODE_Q

                            || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT

                            || keyCode == KeyEvent.KEYCODE_W) {

                        mRotating = 0;

                        handled = true;

                    }

                }

            }

 

            return handled;

        }

 

为了让登陆月球游戏拥有精彩的画面,除了设计java源代码之外,还要设计诸多的图像,才能游戏具备有可玩性。前面的源代码要绘制航飞机的升空,降落,摧毁与斜飞的小图标必须这些图标放置在资源文件res/drawable目录下

如图所示,另外在res/drawable-land与res/drawable-port目录下侧分别放值

着地求与月球的水平与垂直画面,当做游戏的背景画面,

这样不管手机使用者是水平的还是垂直拿着手机,都有相对应的背景画面,让登月游戏画面沾满整个手机屏幕。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   那要如何布局应用这些图片呢?我们必须依靠放置在res/layout目录下的lunar-layout。Xml与res/values目录下的strings。Xml文字资源文件设置来完成,其中lunarlander的布局文件lunar_layout.xml源代码有名称定义的画面的布局为:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

fill_parent 定义让游戏画面沾满整个屏幕,另外定义一个RelativeLayout布局格式,并在该布局里面有名称定义游戏菜单的样式,字形与颜色:

   

        android:layout_width="fill_parent"

        android:layout_height="fill_parent" >

       

          android:id="@+id/text"

         android:text="@string/lunar_layout_text_text"

         android:visibility="visible"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:layout_centerInParent="true"

          android:gravity="center_horizontal"

          android:textColor="#88ffffff"

          android:textSize="24sp"/>

    

     游戏菜单的字符串全部由res\values目录的strings。Xml文字资源中定义的。包括Start,Stop,pause,resume与难易度设置,还有游戏中显示的消息,例如Pasud,GameOver,Sucsses等游戏消息文字字符串都定义在string.xml资源文件中。

    "app_name">Lunar Lander

   

    "menu_start">Start

    "menu_stop">Stop

    "menu_pause">Pause

    "menu_resume">Resume

    "menu_easy">Easy

    "menu_medium">Medium

    "menu_hard">Hard

   

    "mode_ready">Lunar Lander\nPress Up To Play

    "mode_pause">Paused\nPress Up To Resume

    "mode_lose">Game Over\nPress Up To Play

    "mode_win_prefix">Success!\n

    "mode_win_suffix">in a row\nPress Up to Play

   

    "message_stopped">Stopped

    "message_off_pad">Off Landing Pad

    "message_too_fast">Too Fast

    "message_bad_angle">Bad Angle

 

    "lunar_layout_text_text">

 从LunarLander这个游戏程序示范中可以逐渐了解Android程序设计的过程与重点,所有java源代码会放置在程序组件的src目录下,另外要自己生成源代码所需要的一切资源文件,包括将图像放置在res\drawable文件中,将程序的画面布局定义在res\layout文件中,最后将程序的菜单或消息字符串变量定义在res\values的strings.xml文件中,最后AndroidManifest.xml文件里定义安装组件名称,应用程序图标与名称等。

 

参考文摘

Google Android 程序设计指南 杨文志 编者 电子工程出版社。

Google android 入门与实战

 

Android 官方网站http://www.android.com/

开放手持装置联盟(Open Handset Alliance)http://www.openhandsetalliance.com/

Google Android 开发者部落格http://android-developers.blogspot.com/

Android 开发者大赛网站http://code.google.com/android/adc.html

Android 文件http://developer.android.com/

http://www.onlamp.com/pub/a/onlamp/2007/11/12/google-calling-inside-the-gphonesdk.html

CNet 专访:Google 手机平台背后的原创者

http://www.zdnet.com.tw/news/comm/0,2000085675,20125898,00.htm

Android 原始码网站http://source.android.com/

 

 

 

 

 

 

 

 

 

 

09-10秋学期网络工程大作业

 

Google Maps 提供的服务体验演示及简单开发流程

 

 

 

 

 

 

张兆安  1071000135 序号:80

张家越  1071000134 序号:79

周昉石  1071000136 序号:81

郝  铭  1071000145 序号:86

贺静文  1071000146 序号:87

王  洋  1071000160 序号:93

 

 

信息工程学院

目录

引言:....................................................................... 3

1 Google Maps API 介绍....................................................... 3

2 服务体验................................................................... 4

2.1 地址解析............................................................. 4

2.2 街道视图全景......................................................... 4

2.3 路线和路段........................................................... 6

2.4 第三方软件开发....................................................... 7

3 开发环境................................................................... 8

3.1 Google Maps API的开发语言............................................ 8

3.2 Google Maps API 的开发工具........................................... 8

3.2.1  直接使用NotePad编写.......................................... 8

3.2.2 使用软件Aptana编写............................................ 9

3.2.3 Google Maps API 的拓展-------Ajax的简单介绍................... 10

4 Google Maps API的简单开发................................................. 10

4.1 API KEY............................................................. 10

4.2 常用方法............................................................ 10

4.3 应用实例............................................................ 11

4.3.1 改变Google地图色调........................................... 11

4.3.2 Google地图夜间版.............................................. 13

4.3.3 获取地图参数.................................................. 14

4.3.4 设计旅行路线,显示城市信息.................................... 17

4.3.5根据经纬度获取地图信息......................................... 21

5 Google Maps与Google Earth................................................ 25

5.1 Google Maps与Google Earth的直观介绍:.............................. 25

5.1.1谷歌地图(Google Maps).......................................... 25

5.1.2谷歌地球(Google Earth)....................................... 26

5.2 比较:.............................................................. 26

5.2.1从安装使用角度上说,Google Earth 不如Google Maps.............. 26

5.2.2从功能上比较,Google Earth 要比Google Maps强一些.............. 27

5.2.3从开放性来说,Google Earth 不如Google Maps.................... 29

5.3 Google Maps与Google Earth实例比较:................................ 29

5.4  Google Maps与Google Earth的结合:................................. 30

6 总结...................................................................... 31

参考文献:.................................................................. 31

小组成员及分工.............................................................. 32

 


 

Google Maps 提供的服务体验演示以及简单开发流程

 

 

摘  要 : 随着互联网技术的不断成熟,在互联网上服务的新技术陆续出现,Google Maps(谷歌地图)是Google公司提供的地图服务。它能提供两种图:一是矢量地图;二是不同分辨率的卫星照片。本文主要介绍了Google Maps为用户提供的服务,Google Maps API的简单应用和开发流程,Google Maps 和 Google Earth的异同及两者的相互结合。

关键词:Google Maps;API;地图;

引言:

信息技术日新月异,人们对地理信息服务的要求已经从传统的纸质地图载体发展到建立在计算机技术、网络技术、空间技术、通讯技术以及地理信息技术等基础上的现代地理信息服务模式。近年来,以提供网络搜索服务为主的Google推出了新的地图服务Google Earth和Google Maps,Google地图服务及其应用程序接口(Google Maps API)的推出,将面向应用的地图服务提升到更高层面。

目前,已经有越来越多的网站利用Google Maps API,将扩展的地图服务整合到自身的使用之中,在提升易用性的同时,还带来不少新意。本文将对Google Maps的功能、特点和Google Maps API的使用方法等进行简单介绍和举例说明。

1 Google Maps API 介绍

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指 API的说明文档,也称为帮助文档。
   Google 地图 API是一种通过 JavaScript 将 Google 地图嵌入到您的网页的API。它提供了很多处理地图的功能(类似网页http://ditu.google.cn 上的那些功能)和向地图添加内容的服务,让您能够在您的网站上创建功能全面的地图应用。 

Google Maps Api的作用是,将Google Maps服务器上的地图图片和数据下载到客户端并正确显示,显示程序定义的地标点、折线和多边形,实现地址搜索、驾车导航等扩展功能。你可以在网页中直接调用它定义的类和方法,而不必了解它的运行机制,当然这些文件是可见的,需要的话你可以重载它的函数,来实现你想要的功能。Google Maps Api的地图的显示、标点、划线等操作包含59个类,空间、叠加层等包含18个类。

2 服务体验

2.1 地址解析

地址解析是将地址(如“首都师范大学信息工程学院”)转换为相应的地理坐标的过程,可以用于放置标记符或定位地图。如图2-1所示:

图 2-1

在搜索栏中输入“首都师范大学信息工程学院”,单击按钮“Go!”,则会在地图中心位置显示被解析的地址,自动加入标记符,并且弹出标签显示地址名称。

参考实例:

http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/geocoding-simple.html

 

2.2 街道视图全景

    显示指定街道的360度全景图,游览器需要支持Flash插件,目前,中国地区还不支持此项服务,如图2-2所示:

图 2-2

在地图上选择旧金山市的一条街道,会弹出一个标签,显示所选街道的ID、地理坐标、名称等信息,并再产生一个该位置的实际景象视图,如图2-3所示:

图 2-3

通过推拽屏幕,或者选择屏幕左上方的四个箭头,可以改变视角,看到360度全景图,下方的“+”和“-”可以缩放视图。右上角的方框可以切换到全屏模式。

参考实例:

http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/streetview-data.html

2.3 路线和路段

    显示任意两个地方的路线,并详细介绍路线中的路段,目前中国地区不支持此功能,如图2-4所示:

图 2-4

    可以任意输入起点和终点的名称,选择显示语言的种类。在地图上用蓝色突出两地间的行驶路线,并标记出起点和终点。在地图左侧显示经过的路段信息,单击起点或重点则可以显示该地区的实际地图,如图2-5所示:

图 2-5

    可以在普通地图和卫星地图之间切换,缩放视图。

参考实例:

http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/directions-advanced.html

2.4 第三方软件开发

    以谷歌地图开发一些应用程序,比如显示地图版大富翁,如图2-6所示:

图2-6

进入游戏时,背景为谷歌地图,首先选择街道名称。如图2-7所示:

图2-7

游戏方式和之前的大富翁版本没有什么区别,不同的是将虚拟的街道地图,换成了真实的地图。

3 开发环境

3.1 Google Maps API的开发语言

Google Maps Api开发使用的是JavaScript语言并嵌入到HTML语言中。

JavaScript 是一种小型的基于对象的描述语言,用来开发客户服务器类型的Internet应用程序。JavaScript 允许页面制作者在HTML文件中嵌入命令。当页面调入浏览器时,JavaScript 命令将被执行。与 HTML 和 JAVA 语言相比,JavaScript最大的特点就是提供了更多的灵活性和对浏览器本身的控制,帮助Web页面作者制作出更加精美的作品。

JavaScript语言和HTML语言在这就不做详细介绍了,有意者可以自行学习。

3.2 Google Maps API 的开发工具

3.2.1  直接使用NotePad编写

Google Maps Api可以直接使用记事本(NotePad)编写语言,并使用HTML语言的格式,并嵌入JavaScript语言,最后将文件保存为 .htm格式即可。文件用浏览网打开,即可实现相应的功能。

此外还可以使用稍微支持JavaScript语法提示的开发工具,如DreamWeaver,Visual Studio等,这里就不再着重介绍。

3.2.2 使用软件Aptana编写

用NotePad等工具编写HTML语言,所有代码必须自己手写,并且调试非常困难,尤其代码非常长并且非常复杂的时候,运用这些工具更是非常艰难。

Aptane是一款可以识别HTML语言和JavaScript的工具,它提供强大的代码提示,浏览器兼容性提示,错误提示,代码自动完成等功能,并支持各大主流的Ajax开发框架。

现简单介绍一下Aptana软件;

Aptana软件的安装过程如图3-1所示;

图 3-1

Aptama的工作页面如图3-2所示:

图 3-2

3.2.3 Google Maps API 的拓展-------Ajax的简单介绍

Google Maps API基本上是免费使用的,但是需首先向Goolge申请使用权(下一节会详细介绍申请过程和内容),即申请密钥,在网页上也明载了几项使用上的限制,但只这些都不影响我们使用。

当地图的加载量和使用量很小时,使用Google Maps API提供的库函数即可简单解决问题,实现相应的功能,但是当我们所提供的信息太多时,一次全部加载会使得地图显得杂乱无章;并且当设计的是动态更新的页面时,会造成页面的闪烁;当局不页面有所更新时,即使很小,也要更新整个页面,极大地浪费了资源。将Google Maps API和Ajax整合在一起就很好的解决了这个问题。下面简单介绍一下Ajax。

Ajax的关键技术有:

·使用HTML和CSS来建立Web表单并表示网页信息;
·使用JavaScript来操作DOM(Document Object Model)来进行动态显示及交互;
·使用XMLHttpRequest对象与Web服务器进行异步数据交换;
·使用XML进行数据交换及相关操作;
·使用JavaScript将所有东西绑定在一起。

4 Google Maps API的简单开发

4.1 API KEY

   在使用Google Maps API之前,需要向http://www.google.com/apis/maps/ signup.htm申请一组API KEY。当申请到API KEY之后,就可以将Google Maps嵌入到网页了。

本文申请到的密钥为:key=ABQIAAAA1j86tnUDFv8OAtC8dZVtKRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSzmwrQ90SNUILzGRpsBiaa860gfQ。

则如下代码:

 “src=”表示连接到的API地址,”key=”表示上文中提到的密钥,相当于用google Maps API的一个账号。这两行代码即连接到Google Maps网页。

可以说,Google Maps API的应用无处不在。虽然在很多应用中,Google地图的扩展应用只起到辅助作用,但是这用有益的补充还是能够使服务增色不少,更加方便了我们对地理位置的处理。

4.2 常用方法

下面介绍一下代码的一般用法及其通用方法:

1)在用Google API之前,要线申请一个密钥才能使用连接到Google Maps,并使用Google Maps API提供的库文件,调用相应的函数,下面要处理图片使用的函数都是在申请到的API库文件里呢。

本文申请到的密钥为:key=ABQIAAAA1j86tnUDFv8OAtC8dZVtKRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSzmwrQ90SNUILzGRpsBiaa860gfQ。

则如下代码:

 “src=”表示连接到的API地址,”key=”表示上文中提到的密钥,相当于用google Maps API的一个账号。这两行代码即在网页中导入了Google Maps API的库文件。

2)

析:加入一个具有id属性的元素作为Google地图的容器,本文用到的为DIV元素,还定义了容器的大小(即高和宽)。

3)主函数中,map = new GMap2(document.getElementById("map"));

析:方法getElementById是返回文档中具有指定id属性的Element节点,即把刚才src连接网页中下载的Google Maps下载到id为map 的DIV元素中。

4)map.setCenter(new GLatLng(39.92, 116.46), 4);

析:设置Map的中心,调用GlatLng函数,设置中心为(39.92,116.46),放大系数为4。

5)map.addControl( new GMapTypeControl() );

析:在地图的右上方加上三个按钮,分别表示普通图(即交通图),卫星图,两者合称图。

6)map.addControl( new GLargeMapControl() );

   析:加一个大控制面板,即控制地图的缩放级别。

4.3 应用实例

4.3.1 改变Google地图色调


  以下是截取的正常颜色设置下的google地图,如图4-1所示:

图 4-1

通过以下代码我们可以根据自己的意愿,通过对特别函数的运用来改变整个地图的色调。

Function  load(){

   If(GBrowserIsCompatible())

{   //设定普通地图的透明度

G_NORMAL_MAP.getTileLayers()[0].getOpacity=function(){

return 0.4;};

//这里将返回值定在0.4,会使得地图色调接近半透明,你也可以修改为其他0~1之间的数字。

map = new GMap2(document.getElementById(“map”),{mapTypes:[G_NORM

 AL_MAP]});    //必须在创建GMap2后重新设置地图容器的背景颜色

    map.getContainer().style.backgroundColor=”#BBoooo”

    //此条代码通过修改backgroundColor属性,改变了背景颜色。颜色的代码为“BBOOOO”(红色)。

   

map.addcontrol(new GlargeMapControl());

    map.addcontrol(new GMapTypeControl());

    map.setCenter(new GlatLng(39.92,116.46),3);

 

}

}


    经过我们自己加工之后,我们的地图会呈现出完全不同的颜色基调,如图4-2所示:

图 4-2

4.3.2 Google地图夜间版

 代码分析如下:

Function load(){

   If(GBrowserIsCompatible())

{   //下面创建Gcopyright对象,该对象用于控制版权区域,由于google地图中涉及大量有关版权内容,这一对象较为重要

   Var copyright = new GCopyright(100,      //版权的有效区域为整个地图

new GLatLngBounds(new GLatLng(-90,-180),

  new GLatLng(90,180),0,“@2000 NASA”);//版权信息的,版权显示的字符串

//下面创建GcopyrightCollection 对象

Var copyrightCollection = new GCopyrightCollection

(“Peter Pesti”);

 

//添加Gcopyright对象到GCopyrightCollection

copyrightCollection.addCopyright(copyright);

 

//下面创建夜景地图

Var nightTile = new GTileLayer(copyrightCollection, 0,6);

//本条语句将缩放级别设定在(0~6)

nightTile.getTileUrl= fuction(a,z)

//定义了getTileUrl方法

{

return“http:\/\/www-static.cc.gatech.edu\/~pesti\/night\

/t-n\/“+z+””\/”+a.x+”_”+a.y+”.jpeg”;

//这里设定了google地图中所有图片的储存方式

}

    

//创建GTileLayer 数组

Var tilelayers = [nighTile];

  //需要特意说明的是,这个数组用于存放生成地图的图片。我们知道google地图的实现是仰赖于细小图片的排列摆放来完成的,这些图片的摆放都要依靠这个数组来完成。

 

//创建GMapType

Var nightMap = new GMapType(tilelayers,

New GMercatorProjection(12),

                                  “Night”,

                                    {errorMessage:”数据不可用”}

                                  );

 

//创建地图,并添加新的地图类型

Map = new GMap2(document.getElementById(“map”));

Map.addMapType(nightMap);

Map.addControl(nightMap);

Map.addControl(new GLargeMapControl());

Map.setCenter(new GLatLng(42,-87.5),3);

 

效果如图4-3所示:

图4-3

4.3.3 获取地图参数

如图4-4所示:

图4-4

网页及代码见HTML文件attribute.htm,并可打开查看效果。.

代码分析:  

1)  调用拖拽监听函数:

function addDragListener()

    {

       //监听地图上的事件

       GEvent.addDomListener(map, 'dragstart', function()

                    {

                        updateInfo(eventinfo, "当前事件:dragstart");

                    });

       GEvent.addDomListener(map, 'drag', function()

                    {

                        updateInfo(eventinfo, "当前事件:drag");

                        updateInfo(mapcenter, "当前地图中心纬度:" + map.getCenter().lat() + " 经度" + map.getCenter().lng());

                    });

       GEvent.addDomListener(map, 'dragend', function()

                    {

                        updateInfo(eventinfo, "当前事件:dragend");

                    });

    }

析:第一个方法是鼠标刚要动时,监听方法;第二个方法是鼠标拖动过程中,事件为Drag,地图中心的经纬度随之变化;第三个方法是没有拖动时,显示Dragent。如上图所示。

2)调用缩放级别函数,

function addZoomListener()

    {

       //监听地图上的缩放事件

       GEvent.addDomListener(map, 'zoomstart', function()

                    {

                        updateInfo(eventinfo, "当前事件:zoomstart");

                    });

       GEvent.addDomListener(map, 'zoomend', function()

                    {

                        updateInfo(eventinfo, "当前事件:zoomend");

                        updateInfo(zoomlevel, "当前地图缩放级别:" + map.getZoom());

                    });

析:当鼠标动左边的缩放按钮时,监听事件为Zoomed,并相应的监听缩放级别并显示。如图4-5:

图4-5

3)调用改变地图类型函数;

function addMapTypeListener()

    {

       //监听地图上maptypechanged事件

       GEvent.addDomListener(map, 'maptypechanged', function()

                    {

                        updateInfo(eventinfo, "当前事件:maptypechanged");

                        updateInfo(maptype, "当前地图类型:" + map.getCurrentMapType().getName(false));

                    });

    }

析:当鼠标点击左上方的地图类型按钮时,监听到事件为Maptypechanged,并相应的改变地图类型并显示。如图4-6:

图 4-6

4.3.4 设计旅行路线,显示城市信息

图 4-7

    效果如图4-7所示。可以挪动红色标签,改变行车路线,并可以点击其他城市的绿色标签,显示不同信息。假如我不想去西安了,我想去重庆,并且想查看上海的信息,如图4-8所示:

图4-8

添加的红色标签,也可以显示信息,但是标签的内容只能是一样的,如图4-9所示:

图 4-9

具体代码见HTMl文件travel.htm,并可以打开查看效果。

功能代码分析:

一共有三个函数,注释及代码如下:

1)  创建红色地标代码分析:

function createMarker(point)

    {

      var marker = new GMarker(point, {icon: myIcon, draggable: true, bouncy: true}); //创建新地标,类型为定义的myIcon类型,可以拖拽,并且有阴影

      var index = markers.length; //记录添加的标签的个数

     

      //双击地标删除该地标

      GEvent.addListener(marker, 'dblclick', function()

                          {

                            deleteMarker(marker);//调用删除方法

                          });

      //dragstart事件,换新图标

      GEvent.addListener(marker, 'dragstart', function()

                          {

                            marker.setImage("http://www.google.com/mapfiles/dd-start.png");//设置要换的新图标的类型

                          });

      //dragend事件,换回原图标

      GEvent.addListener(marker, 'dragend', function()

                          {

                            marker.setImage("http://www.google.com/mapfiles/marker.png");//换回原来的标签类型;

                          }); 

    //单击显示形成安排,即显示红的标签信息

      GEvent.addListener(marker, 'click', function()

                          {

                            marker.openInfoWindowHtml("这个城市很好玩!");

                          });            

      //drag事件

      //注意,如果添加了polyline,则拖动地标时需要重画路线

      GEvent.addListener(marker, 'drag', function()

                          {

                            redrawPolyline();//重新画路程线;

                          });

      marker.setIndex(index);//并重新设置地标个数

      markers[index] = marker;//将现在的标签替换为原来的标签

      map.addOverlay(marker);//创建新地标

     

      //每创建一个新的地标就重画一次

      redrawPolyline();

}

2)  创建绿色标签,并显示相应的内容;

function createsmall(point){

         var marker = new GMarker(myPoints[i], {icon: myIcon1, bouncy: true});

//如上,在数组myPoint[i]处设置类型为myPoint1,并且有阴影的标签

                map.addOverlay(marker);//显示标签;

               

            GEvent.addListener(marker, 'click', function(point)

                          {

                              for(i=0;i

                                     if(point==myPoints[i])  marker.openInfoWindowHtml(names[i]);

                             } //点击绿色标签时,显示内容names[i];

                          });

  }

3)  添加路线函数:

function addPolyline()

    {

      var points = [];

      for(var i=0; i

      {

        points[i] = markers[i].getPoint();//获取端点;

      }

     

      polyline = new GPolyline(

        points, //GLatLng()数组

        "#FF0000",

        10,

        0.5

        );//设置行程的颜色,宽度,透明度。

      map.addOverlay(polyline); //画路线

    }

    //删除行程路线方法

    function removePolyline()

    {

      polyline.remove();//调用remove方法;

      polyline = null;

    }

    //重画行程路线方法

    function redrawPolyline()

    {

      if(polyline)

      {

        removePolyline();

      }

      addPolyline();

}

4)  双击删除标签:

function deleteMarker(marker)

    {

      //弹出窗口确定是否真的删除

      if(!confirm("确定删除该地标吗?")) return;

      var index = marker.index;

       //移除该图层

      map.removeOverlay(marker);

      //从数组中删除指定GMarker并更新index

      for(var i = index; i

      {

          markers[i+1].setIndex(i);

          markers[i] = markers[i+1];//减少一个标签

      }

      markers.length = markers.length-1;//使标签的数量减一

}

 

【注】:上面添加的这些地图信息完全可用应用Ajax技术实现,即先建立一个XML文件,然后再代码中加载这个XML文件,便可将信息加载到地图中,这种方法简洁好用。但是这要求能和Goolge Maps服务器的通信,我们做时就是通信问题没有解决,故用的是最原始的办法(直接在代码中添加地图信息)。

4.3.5根据经纬度获取地图信息

   此功能达到的效果图如下:

  1)根据输入的经纬度获取地图信息,如图4-10:

图 4-10

2)直接在地图上点击,获取地图信息,如图4-11:

图 4-11

代码分析:

此过程先建立了一个文件maps存放地图的各种载入信息,包括与Google Maps API的连接,地图信息的连接,以及地图信息的回应和载入。应用的技术为Ajax技术,具体里面的实现方法特别复杂,故有待考察。

主程序代码如下:

1)