王存宇 朱琪 彭敏佳 金凤飞
摘 要: Android是由Google开发的一种开源的智能手机操作系统,它基于Linux平台,由操作系统、应用软件、中间件和用户界面组成,是真正开放和首个完全为移动终端打造的软件。文章介绍了Android平台手机地图开发的背景及现状;讲解了控件、布局方式、Android应用程序状态生命周期、Google Maps API等使用方法;详细设计并实现了Android平台上手机地图界面和简单功能。
关键词: Android; 地图系统; maps API; 布局
中图分类号:TP399 文献标志码:A 文章编号:1006-8228(2015)04-32-03
Abstract: Android developed by Google is a open source smart phone operating system based on Linux. Android consists of operating system, application, middleware and user interface. This paper describes the background of the Android platform mobile maps development, and explains the usage of controls, layout, Android application lifecycle state, Google Maps API, and so on.Finally, the design and realization of the mobile map interface and the simple function for Android platform are described in detail.
Key words: Android; map system; maps API; layout
0 引言
随着3G、4G 时代的到来,手机已经成为人们一种快捷而重要的获取信息手段。地图与信息的结合,扩展了手机地图服务的功能,极大地提高了人们获取信息的直观性, 为人们出行、旅游及位置相关信息的获取带来了方便[1]。
手机地图服务属于高新技术产业,它的产生对很多行业都有促进作用。手机地图服务可以帮助一些相关行业提高其工作效率。其中最典型的就是安全抢险救援,手机电子地图提供的定位服务和最快路线到达服务将给救援工作的效率及质量带来极大提升。
本文首先介绍了Android的相关控件的特性,然后对于特定的GoogleMap API作了介绍,最后简单实现该手机地图功能。
1 Android的视图组件
Android应用开发的主要内容之一是界面。随着移动设备的不断普及,Android应用几乎无处不在。对于用户来说,除了看重一个应用的功能外,图形界面也是最关注的对象。如果一个应用没有提供友好的图形界面,那么将很难吸引最终的用户[2]。
1.1 Button组件
1.2 EditText组件
EditText是一个非常重要的组件,可以说它是用户和Android应用进行数据传输的窗户,有了它就等于有了一扇和Android应用传输的门,通过它用户可以把数据传给Android应用,然后得到我们想要的数据[3]。
EditText控件主要设置一些主要的属性,可以设置如下:
android:textColorHint属性设置颜色;
android:hint属性设置当EditText内容为空时显示的文本;
android:enabled="false"实现EditText不可编辑;
android:password="true"实现密码输入功能;
android:phoneNumber="true"把该控件变成只接受电话号码输入的文本框;
android:numeric控制输入数字类型;
android:inputType设置文本的类型,让输入法选择合适的软键盘。
1.3 ImageView组件
ImageView也就是图像视图,用于在屏幕中显示任何的Drawable对象,通常用来显示图片。其有如下属性。
android:adjustViewBounds:用于设置ImageView是否调整自己的边界来保持所显示图片的长宽比。
android:maxHeight:设置ImageView的最大高度,需要设置adjustViewBounds属性值为true,否则不起作用。
android:maxWidth:设置ImageView的最大宽度,需要设置android:adjustViewBounds属性值为true,否则不起作用。
android:scaleType:这个属性是比较重要的属性,用于设置所显示的图片如何缩放或移动以适应ImageView的大小,其属性值可以是matrix(使用matrix方式进行缩放)、fitXY(对图片横向、纵向独立缩放,使得该图片完全适应于该ImageView,图片的纵横比可能会改变)、fitStart(保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后该图片放在ImageView的左上角)、fitCenter(保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后该图片放在ImageView的中央)、fitEnd(保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后该图片放在ImageView的右下角)、center(把图像放在ImageView的中间,但不进行任何缩放)、centerCrop(保持纵横比缩放图片,以使得图片能完全覆盖ImageView)或centerInside(保持纵横比缩放图片,以使得ImageView能完全显示该图片)。
1.4 Menu组件
菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为三种:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。
⑴ OptionMenu
默认样式是在屏幕底部弹出一个菜单,这个菜单我们就称为选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排,每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第6项开始会被隐藏,在第6项会出现一个More里,点击More才出现第6项以及以后的菜单项,这些菜单项也被称作Expanded Menus。
其一些API如下:
onCreateOptionsMenu(Menu menu)方法,并在此方法中添加菜单项,最后返回true,如果false,菜单则不会显示。
onOptionsItemSelected(MenuItem im)方法为菜单项注册事件。
onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。
onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,用户可以用此方法来根据打当时的情况调整菜单。
onMenuOpened(int Id, Menu menu):单打开后发生的动作。
⑵ ContextMenu
android的context menu上下文菜单,选择某项VIEW后,长按menu键就会显示。ContextMenu的使用和OptionsMenu相似,先添加XML文件,然后重载对应的方法成员。重载的方法有onCreateContextMenu方法。接下来是处理菜单的点击事件onContextItemSelected(MenuItem item)。
ContextMenu和OptionsMenu主菜单不同的是上下文菜单需要使用registerForContextMenu进行注册,否则将无法显示。
⑶ SubMenu
一个Menu对象可以拥有0或多个SubMenu,通过调用Menu.addSubMenu方法将SubMenu添加到当前Menu中。在SubMenu 添加MenuItem的方式和在Menu中添加MenuItem方式一样,因为SubMenu是Menu的子类,但是SubMenu里不能再添加 SubMenu。
Android提供了基于Group id管理多个MenuItem的方法。
removeGroup(int group):移除所有属于group的MenuItem。
SetGroupEnable(int gp ,boolean b):批量开启或关闭整个组的MenuItem。
setGroupVisible(int g,boolean b):批量显示或隐藏整个组的MenuItem。
setGroupCheckable(int group, boolean checkable,boolean exclusive):设置菜单是否可选中。
2 Google Map API
2.1 Map API KEY申请
如果你使用的是eclipse编写android程序,那么就打开eclipse->Windows→Preference→Android→Build,其中Default debug keystore的值便是debug.keystore的路径。
执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里输入默认的密码“android”,即可取得MD5值。
打开网页:https://developers.google.com/maps/documentation/
android/start#installing_the_google_maps_android_v2_api,点击Creating an API Project,然后点击 Google APIs Console,然后点击左侧栏的Servises,在右侧出来的列表中往下翻,知道你找到Google Maps API v2,然后点击那个开关,使其状态为开。
点击左侧栏的API Access,在右侧出来的页面中点击Create new Android key,此时会弹出来一个页面,在输入框中输入你之前得到的认证书,然后点击create后便生成对应的api key,复制key,然后在你的安卓工程的AndroidManifest.xml中添加key。
2.2 MAP API详解
Google MaP API为LBS开发者提供了基础的地图服务。
⑴ MapView:为显示地理数据提供了一个使用的用户界面选项。提供物理位置或者地址的上下文的最直观的方式就是在地图上显示它。使用MapView,就可以创建出提供了交互式的图的活动。要使用MapView,需要在布局文件中包含MapView控件,并在MapView控件中添加申请到的google map key。
public void setSatellite(boolean on),当参数为true时设置为卫星地图,false时不设置为卫星地图显示;
public void setTraffic(boolean on),当参数为 true 时设置为交通地图,false 时不设置为交通地图显示;
public void setStreetView(boolean on),当参数为 true 时设置为街景地图,false时不设置为街景地图地图显示。
public boolean isSatellite(),判断是否是卫星地图;
public boolean isTrafficQ,判断是否是交通地图;
public boolean isStreetView(),判断是否是街景地图。
public GeoPoint getMapCenter(),通过这个函数来获取Map地图的中心。
public int getLongitudeSpan(),得到经度;
public int getLatitudeSpan(),得到讳度。
⑵ MapActivity:用来创建新的地图活动的可扩展的基类,它可以包含一个MapView。MapActivity可以处理应用程序的生命周期以及显示地图所要求的后台服务管理。因此,只能在MapActivity的派生类中使用MapView。
protected abstract boolean isRouteDisplayed(),是否正在显示路线地图;
protected boolean isLocationDisplayed(),是否在显示位置信息。
overlay:覆盖是用来向MapView中添加注释的单击处理的方法。每一个覆盖都可以直接在画布上绘制ZD原语,包括文本、直线、图片和各种形状,之后它们会被用来覆盖到MapView之上。开发者可以向一个地图中添加多个覆盖。分派给一个MapView的所有覆盖都是作为层而添加的,较新的层可能会模糊较旧的层。用户单击是通过栈进行传递的,直到它们被覆盖处理,或者作为MapView本身的单击进行注册为止。
MyLocationoveriay:一个特殊的覆盖,它可以用来显示当前的位置和设备的方向。
ItemiZedoverlayS和OVerlayltems:两者结合在一起使用可以创建一个地图标记层,并使用带文本的图片对其进行显示。
3 系统的设计与实现
地图软件的主要功能[4]如下:
⑴ 地图模块,可以对地图进行放大、缩小和移动查看地理位置;
⑵ 经韩度定位模块,可以让用户在手机屏幕界面输入经度和讳度数值来查看目标地理位置,目标地理位置显示在手机地图屏幕的中心,并且可以对地图进行放大、缩小和移动查看;(DGPS轨迹记录模块,记录用户的行程轨迹,并计算出行程距离,并且可以对地图进行放大、缩小和移动查看;
⑶ 行程路线选择模块,用户可以输入出发点和目的地名称去查询两地之间行程路线选择,可以选择步行出行、乘公交出行、自驾出行方式下路线的选择,并且可以对地图进行放大、缩小和移动查看;
⑷ GPS自身定位模块,用户可以通过打开手机的GPS来定位自己目前所处的位置在哪,并显示在手机地图的中心。
Main.xml采用RelativeLayout相对布局里面嵌套LinearLayout线性布局的方式,实现代码略。该系统的主页界面如图1所示。
4 结论
目前,Android手机操作系统己经成为市场占有率第一的智能手机系统。本手机地图服务实现了地图服务的所有基本功能。本文将GPS位置定位技术和Google Maps提供的相关接口运用于手机地图各个功能模块的设计与实现。该地图系统尚缺少向导等智能功能,这有待进一步研究和实践。
参考文献:
[1] RetoMeier.Android高级编程[M].清华大学出版社,2006.
[2] 陈钊.Android程序主要组成部分概述[J].中国新技术新产品,2011.17:42-43
[3] 陈星,江兰帆.基于GoogleAndroid平台的移动开发研究[J].福建电脑,2008.11:156-157
[4] 孙晓宇.Android手机界面管理系统的设计与实现[D].北京邮电大学硕士学位论文,2009.