王存宇 朱琪 彭敏佳 金鳳飛
摘 要: Android是由Google開(kāi)發(fā)的一種開(kāi)源的智能手機(jī)操作系統(tǒng),它基于Linux平臺(tái),由操作系統(tǒng)、應(yīng)用軟件、中間件和用戶界面組成,是真正開(kāi)放和首個(gè)完全為移動(dòng)終端打造的軟件。文章介紹了Android平臺(tái)手機(jī)地圖開(kāi)發(fā)的背景及現(xiàn)狀;講解了控件、布局方式、Android應(yīng)用程序狀態(tài)生命周期、Google Maps API等使用方法;詳細(xì)設(shè)計(jì)并實(shí)現(xiàn)了Android平臺(tái)上手機(jī)地圖界面和簡(jiǎn)單功能。
關(guān)鍵詞: Android; 地圖系統(tǒng); maps API; 布局
中圖分類號(hào):TP399 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 時(shí)代的到來(lái),手機(jī)已經(jīng)成為人們一種快捷而重要的獲取信息手段。地圖與信息的結(jié)合,擴(kuò)展了手機(jī)地圖服務(wù)的功能,極大地提高了人們獲取信息的直觀性, 為人們出行、旅游及位置相關(guān)信息的獲取帶來(lái)了方便[1]。
手機(jī)地圖服務(wù)屬于高新技術(shù)產(chǎn)業(yè),它的產(chǎn)生對(duì)很多行業(yè)都有促進(jìn)作用。手機(jī)地圖服務(wù)可以幫助一些相關(guān)行業(yè)提高其工作效率。其中最典型的就是安全搶險(xiǎn)救援,手機(jī)電子地圖提供的定位服務(wù)和最快路線到達(dá)服務(wù)將給救援工作的效率及質(zhì)量帶來(lái)極大提升。
本文首先介紹了Android的相關(guān)控件的特性,然后對(duì)于特定的GoogleMap API作了介紹,最后簡(jiǎn)單實(shí)現(xiàn)該手機(jī)地圖功能。
1 Android的視圖組件
Android應(yīng)用開(kāi)發(fā)的主要內(nèi)容之一是界面。隨著移動(dòng)設(shè)備的不斷普及,Android應(yīng)用幾乎無(wú)處不在。對(duì)于用戶來(lái)說(shuō),除了看重一個(gè)應(yīng)用的功能外,圖形界面也是最關(guān)注的對(duì)象。如果一個(gè)應(yīng)用沒(méi)有提供友好的圖形界面,那么將很難吸引最終的用戶[2]。
1.1 Button組件
1.2 EditText組件
EditText是一個(gè)非常重要的組件,可以說(shuō)它是用戶和Android應(yīng)用進(jìn)行數(shù)據(jù)傳輸?shù)拇皯?,有了它就等于有了一扇和Android應(yīng)用傳輸?shù)拈T,通過(guò)它用戶可以把數(shù)據(jù)傳給Android應(yīng)用,然后得到我們想要的數(shù)據(jù)[3]。
EditText控件主要設(shè)置一些主要的屬性,可以設(shè)置如下:
android:textColorHint屬性設(shè)置顏色;
android:hint屬性設(shè)置當(dāng)EditText內(nèi)容為空時(shí)顯示的文本;
android:enabled="false"實(shí)現(xiàn)EditText不可編輯;
android:password="true"實(shí)現(xiàn)密碼輸入功能;
android:phoneNumber="true"把該控件變成只接受電話號(hào)碼輸入的文本框;
android:numeric控制輸入數(shù)字類型;
android:inputType設(shè)置文本的類型,讓輸入法選擇合適的軟鍵盤。
1.3 ImageView組件
ImageView也就是圖像視圖,用于在屏幕中顯示任何的Drawable對(duì)象,通常用來(lái)顯示圖片。其有如下屬性。
android:adjustViewBounds:用于設(shè)置ImageView是否調(diào)整自己的邊界來(lái)保持所顯示圖片的長(zhǎng)寬比。
android:maxHeight:設(shè)置ImageView的最大高度,需要設(shè)置adjustViewBounds屬性值為true,否則不起作用。
android:maxWidth:設(shè)置ImageView的最大寬度,需要設(shè)置android:adjustViewBounds屬性值為true,否則不起作用。
android:scaleType:這個(gè)屬性是比較重要的屬性,用于設(shè)置所顯示的圖片如何縮放或移動(dòng)以適應(yīng)ImageView的大小,其屬性值可以是matrix(使用matrix方式進(jìn)行縮放)、fitXY(對(duì)圖片橫向、縱向獨(dú)立縮放,使得該圖片完全適應(yīng)于該ImageView,圖片的縱橫比可能會(huì)改變)、fitStart(保持縱橫比縮放圖片,直到該圖片能完全顯示在ImageView中,縮放完成后該圖片放在ImageView的左上角)、fitCenter(保持縱橫比縮放圖片,直到該圖片能完全顯示在ImageView中,縮放完成后該圖片放在ImageView的中央)、fitEnd(保持縱橫比縮放圖片,直到該圖片能完全顯示在ImageView中,縮放完成后該圖片放在ImageView的右下角)、center(把圖像放在ImageView的中間,但不進(jìn)行任何縮放)、centerCrop(保持縱橫比縮放圖片,以使得圖片能完全覆蓋ImageView)或centerInside(保持縱橫比縮放圖片,以使得ImageView能完全顯示該圖片)。
1.4 Menu組件
菜單是用戶界面中最常見(jiàn)的元素之一,使用非常頻繁,在Android中,菜單被分為三種:選項(xiàng)菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu)。
⑴ OptionMenu
默認(rèn)樣式是在屏幕底部彈出一個(gè)菜單,這個(gè)菜單我們就稱為選項(xiàng)菜單OptionsMenu,一般情況下,選項(xiàng)菜單最多顯示2排,每排3個(gè)菜單項(xiàng),這些菜單項(xiàng)有文字有圖標(biāo),也被稱作Icon Menus,如果多于6項(xiàng),從第6項(xiàng)開(kāi)始會(huì)被隱藏,在第6項(xiàng)會(huì)出現(xiàn)一個(gè)More里,點(diǎn)擊More才出現(xiàn)第6項(xiàng)以及以后的菜單項(xiàng),這些菜單項(xiàng)也被稱作Expanded Menus。
其一些API如下:
onCreateOptionsMenu(Menu menu)方法,并在此方法中添加菜單項(xiàng),最后返回true,如果false,菜單則不會(huì)顯示。
onOptionsItemSelected(MenuItem im)方法為菜單項(xiàng)注冊(cè)事件。
onOptionsMenuClosed(Menu menu):菜單關(guān)閉后發(fā)生的動(dòng)作。
onPrepareOptionsMenu(Menu menu):選項(xiàng)菜單顯示之前onPrepareOptionsMenu方法會(huì)被調(diào)用,用戶可以用此方法來(lái)根據(jù)打當(dāng)時(shí)的情況調(diào)整菜單。
onMenuOpened(int Id, Menu menu):?jiǎn)未蜷_(kāi)后發(fā)生的動(dòng)作。
⑵ ContextMenu
android的context menu上下文菜單,選擇某項(xiàng)VIEW后,長(zhǎng)按menu鍵就會(huì)顯示。ContextMenu的使用和OptionsMenu相似,先添加X(jué)ML文件,然后重載對(duì)應(yīng)的方法成員。重載的方法有onCreateContextMenu方法。接下來(lái)是處理菜單的點(diǎn)擊事件onContextItemSelected(MenuItem item)。
ContextMenu和OptionsMenu主菜單不同的是上下文菜單需要使用registerForContextMenu進(jìn)行注冊(cè),否則將無(wú)法顯示。
⑶ SubMenu
一個(gè)Menu對(duì)象可以擁有0或多個(gè)SubMenu,通過(guò)調(diào)用Menu.addSubMenu方法將SubMenu添加到當(dāng)前Menu中。在SubMenu 添加MenuItem的方式和在Menu中添加MenuItem方式一樣,因?yàn)镾ubMenu是Menu的子類,但是SubMenu里不能再添加 SubMenu。
Android提供了基于Group id管理多個(gè)MenuItem的方法。
removeGroup(int group):移除所有屬于group的MenuItem。
SetGroupEnable(int gp ,boolean b):批量開(kāi)啟或關(guān)閉整個(gè)組的MenuItem。
setGroupVisible(int g,boolean b):批量顯示或隱藏整個(gè)組的MenuItem。
setGroupCheckable(int group, boolean checkable,boolean exclusive):設(shè)置菜單是否可選中。
2 Google Map API
2.1 Map API KEY申請(qǐng)
如果你使用的是eclipse編寫(xiě)android程序,那么就打開(kāi)eclipse->Windows→Preference→Android→Build,其中Default debug keystore的值便是debug.keystore的路徑。
執(zhí)行命令:keytool -list -keystore debug.keystore,這時(shí)可能會(huì)提示你輸入密碼,這里輸入默認(rèn)的密碼“android”,即可取得MD5值。
打開(kāi)網(wǎng)頁(yè):https://developers.google.com/maps/documentation/
android/start#installing_the_google_maps_android_v2_api,點(diǎn)擊Creating an API Project,然后點(diǎn)擊 Google APIs Console,然后點(diǎn)擊左側(cè)欄的Servises,在右側(cè)出來(lái)的列表中往下翻,知道你找到Google Maps API v2,然后點(diǎn)擊那個(gè)開(kāi)關(guān),使其狀態(tài)為開(kāi)。
點(diǎn)擊左側(cè)欄的API Access,在右側(cè)出來(lái)的頁(yè)面中點(diǎn)擊Create new Android key,此時(shí)會(huì)彈出來(lái)一個(gè)頁(yè)面,在輸入框中輸入你之前得到的認(rèn)證書(shū),然后點(diǎn)擊create后便生成對(duì)應(yīng)的api key,復(fù)制key,然后在你的安卓工程的AndroidManifest.xml中添加key。
2.2 MAP API詳解
Google MaP API為L(zhǎng)BS開(kāi)發(fā)者提供了基礎(chǔ)的地圖服務(wù)。
⑴ MapView:為顯示地理數(shù)據(jù)提供了一個(gè)使用的用戶界面選項(xiàng)。提供物理位置或者地址的上下文的最直觀的方式就是在地圖上顯示它。使用MapView,就可以創(chuàng)建出提供了交互式的圖的活動(dòng)。要使用MapView,需要在布局文件中包含MapView控件,并在MapView控件中添加申請(qǐng)到的google map key。
public void setSatellite(boolean on),當(dāng)參數(shù)為true時(shí)設(shè)置為衛(wèi)星地圖,false時(shí)不設(shè)置為衛(wèi)星地圖顯示;
public void setTraffic(boolean on),當(dāng)參數(shù)為 true 時(shí)設(shè)置為交通地圖,false 時(shí)不設(shè)置為交通地圖顯示;
public void setStreetView(boolean on),當(dāng)參數(shù)為 true 時(shí)設(shè)置為街景地圖,false時(shí)不設(shè)置為街景地圖地圖顯示。
public boolean isSatellite(),判斷是否是衛(wèi)星地圖;
public boolean isTrafficQ,判斷是否是交通地圖;
public boolean isStreetView(),判斷是否是街景地圖。
public GeoPoint getMapCenter(),通過(guò)這個(gè)函數(shù)來(lái)獲取Map地圖的中心。
public int getLongitudeSpan(),得到經(jīng)度;
public int getLatitudeSpan(),得到諱度。
⑵ MapActivity:用來(lái)創(chuàng)建新的地圖活動(dòng)的可擴(kuò)展的基類,它可以包含一個(gè)MapView。MapActivity可以處理應(yīng)用程序的生命周期以及顯示地圖所要求的后臺(tái)服務(wù)管理。因此,只能在MapActivity的派生類中使用MapView。
protected abstract boolean isRouteDisplayed(),是否正在顯示路線地圖;
protected boolean isLocationDisplayed(),是否在顯示位置信息。
overlay:覆蓋是用來(lái)向MapView中添加注釋的單擊處理的方法。每一個(gè)覆蓋都可以直接在畫(huà)布上繪制ZD原語(yǔ),包括文本、直線、圖片和各種形狀,之后它們會(huì)被用來(lái)覆蓋到MapView之上。開(kāi)發(fā)者可以向一個(gè)地圖中添加多個(gè)覆蓋。分派給一個(gè)MapView的所有覆蓋都是作為層而添加的,較新的層可能會(huì)模糊較舊的層。用戶單擊是通過(guò)棧進(jìn)行傳遞的,直到它們被覆蓋處理,或者作為MapView本身的單擊進(jìn)行注冊(cè)為止。
MyLocationoveriay:一個(gè)特殊的覆蓋,它可以用來(lái)顯示當(dāng)前的位置和設(shè)備的方向。
ItemiZedoverlayS和OVerlayltems:兩者結(jié)合在一起使用可以創(chuàng)建一個(gè)地圖標(biāo)記層,并使用帶文本的圖片對(duì)其進(jìn)行顯示。
3 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
地圖軟件的主要功能[4]如下:
⑴ 地圖模塊,可以對(duì)地圖進(jìn)行放大、縮小和移動(dòng)查看地理位置;
⑵ 經(jīng)韓度定位模塊,可以讓用戶在手機(jī)屏幕界面輸入經(jīng)度和諱度數(shù)值來(lái)查看目標(biāo)地理位置,目標(biāo)地理位置顯示在手機(jī)地圖屏幕的中心,并且可以對(duì)地圖進(jìn)行放大、縮小和移動(dòng)查看;(DGPS軌跡記錄模塊,記錄用戶的行程軌跡,并計(jì)算出行程距離,并且可以對(duì)地圖進(jìn)行放大、縮小和移動(dòng)查看;
⑶ 行程路線選擇模塊,用戶可以輸入出發(fā)點(diǎn)和目的地名稱去查詢兩地之間行程路線選擇,可以選擇步行出行、乘公交出行、自駕出行方式下路線的選擇,并且可以對(duì)地圖進(jìn)行放大、縮小和移動(dòng)查看;
⑷ GPS自身定位模塊,用戶可以通過(guò)打開(kāi)手機(jī)的GPS來(lái)定位自己目前所處的位置在哪,并顯示在手機(jī)地圖的中心。
Main.xml采用RelativeLayout相對(duì)布局里面嵌套LinearLayout線性布局的方式,實(shí)現(xiàn)代碼略。該系統(tǒng)的主頁(yè)界面如圖1所示。
4 結(jié)論
目前,Android手機(jī)操作系統(tǒng)己經(jīng)成為市場(chǎng)占有率第一的智能手機(jī)系統(tǒng)。本手機(jī)地圖服務(wù)實(shí)現(xiàn)了地圖服務(wù)的所有基本功能。本文將GPS位置定位技術(shù)和Google Maps提供的相關(guān)接口運(yùn)用于手機(jī)地圖各個(gè)功能模塊的設(shè)計(jì)與實(shí)現(xiàn)。該地圖系統(tǒng)尚缺少向?qū)У戎悄芄δ?,這有待進(jìn)一步研究和實(shí)踐。
參考文獻(xiàn):
[1] RetoMeier.Android高級(jí)編程[M].清華大學(xué)出版社,2006.
[2] 陳釗.Android程序主要組成部分概述[J].中國(guó)新技術(shù)新產(chǎn)品,2011.17:42-43
[3] 陳星,江蘭帆.基于GoogleAndroid平臺(tái)的移動(dòng)開(kāi)發(fā)研究[J].福建電腦,2008.11:156-157
[4] 孫曉宇.Android手機(jī)界面管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京郵電大學(xué)碩士學(xué)位論文,2009.