




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE37基于Android系統(tǒng)的手機(jī)地圖應(yīng)用軟件開(kāi)發(fā)PAGE36Android手機(jī)地圖應(yīng)用軟件開(kāi)發(fā)設(shè)計(jì)方案目錄摘要……………………Ⅰ1緒論………………………11.1選題背景和意義…………………11.2安卓發(fā)展歷史……………………21.3安卓與主流手機(jī)系統(tǒng)……………31.4本文主體結(jié)構(gòu)……………………42安卓系統(tǒng)簡(jiǎn)介……………62.1安卓SDK…………62.1.1AndroidSDK內(nèi)容…………62.1.2AndroidAPI核心包分析…………………62.1.3AndroidSDK提供的工具包………………72.2安卓系統(tǒng)的應(yīng)用程序組成………82.2.1Activity…………………82.2.2BroadcastIntentReceiver…………82.2.3Service……………………82.2.4ContentProvider…………82.3安卓系統(tǒng)的應(yīng)用程序體系結(jié)構(gòu)…………………93開(kāi)發(fā)工具及系統(tǒng)環(huán)境搭建………………103.1開(kāi)發(fā)工具簡(jiǎn)介……………………103.2開(kāi)發(fā)環(huán)境搭建……………………103.3虛擬機(jī)簡(jiǎn)介………………………114安卓系統(tǒng)手機(jī)地圖設(shè)計(jì)…………………134.1開(kāi)發(fā)方法及步驟…………………134.2設(shè)計(jì)理念…………134.3功能需求分析……………………144.4系統(tǒng)模塊分析……………………144.5程序流程圖………………………154.5.1應(yīng)用程序流程跳轉(zhuǎn)………164.5.2應(yīng)用程序流程跳轉(zhuǎn)及Activity分析…………………165手機(jī)地圖應(yīng)用軟件的實(shí)現(xiàn)………………185.1程序主界面………………………195.2程序主界面的實(shí)現(xiàn)………………195.3我的地圖功能實(shí)現(xiàn)………………225.4實(shí)時(shí)定位功能實(shí)現(xiàn)………………255.5繪制圖形功能實(shí)現(xiàn)………………275.6地圖標(biāo)記功能實(shí)現(xiàn)………………285.7地點(diǎn)搜索功能實(shí)現(xiàn)………………295.8公交查詢功能實(shí)現(xiàn)………………315.9離線地圖功能實(shí)現(xiàn)………………326結(jié)束語(yǔ)……………………346.1總結(jié)………………346.2展望………………34參考文獻(xiàn)……………………36附錄…………………………37摘要隨著日異月新的科技發(fā)展,人們的生活越來(lái)越豐富多彩。我們已經(jīng)身處信息爆炸以及知識(shí)經(jīng)濟(jì)繁榮的世界。這樣的潮流同時(shí)帶動(dòng)了移動(dòng)設(shè)備的迅猛發(fā)展,其中智能手機(jī)大有作為。而安卓操作系統(tǒng)正是現(xiàn)今智能手機(jī)上最為流行,最為開(kāi)放,最有可能統(tǒng)治智能手機(jī)市場(chǎng)的一種功能強(qiáng)大的系統(tǒng)。本文通過(guò)介紹安卓系統(tǒng)的歷史淵源,體系結(jié)構(gòu)以及同各大主流手機(jī)操作系統(tǒng)的對(duì)比,指出安卓系統(tǒng)能獨(dú)樹(shù)一幟,統(tǒng)領(lǐng)手機(jī)市場(chǎng)的必然性。本文還全面展示了用Eclipse開(kāi)發(fā)工具開(kāi)發(fā)手機(jī)應(yīng)用軟件的方法,介紹了例如Activity,Intent,Service以及ContentProvider等基礎(chǔ)概念,分析了安卓應(yīng)用程序的目錄結(jié)構(gòu),基本組件以及數(shù)據(jù)存取等。在這些基本概念的理解之上,本文還詳盡介紹了手機(jī)地圖開(kāi)發(fā)的步驟和實(shí)現(xiàn)機(jī)制。通過(guò)百度公司提供的API,獲取其地圖密鑰,結(jié)合幫助文檔,實(shí)現(xiàn)了地圖的定位,路線繪制以及標(biāo)記等基本功能。文章最后全面展示了此款手機(jī)地圖應(yīng)用軟件的系統(tǒng)界面,調(diào)試結(jié)果以及各大功能,從而說(shuō)明前期設(shè)計(jì)理念和方法的正確性和可行性。關(guān)鍵詞:安卓,智能手機(jī),定位,地圖
1緒論1.1選題背景和意義萊特發(fā)明飛機(jī)的前200年,人們都說(shuō)那種在天上飛翔的機(jī)械根本不可能實(shí)現(xiàn),同樣,人們也無(wú)法想象貝爾發(fā)明的電話最終會(huì)演變成現(xiàn)在的移動(dòng)電話。進(jìn)入3G時(shí)代的人們,早就不能滿足于用手機(jī)打電話或者發(fā)短信,現(xiàn)在的手機(jī)已經(jīng)成為我們不可缺少的娛樂(lè)工具,閑暇之余,我們用手機(jī)看電影,聽(tīng)音樂(lè),看電子書(shū),和家人視頻聊天,我們甚至用手機(jī)網(wǎng)上購(gòu)物,把手機(jī)充當(dāng)支付工具。這些強(qiáng)大的功能是一般手機(jī)系統(tǒng)或是非智能手機(jī)所不能實(shí)現(xiàn)的。軟件的實(shí)現(xiàn)需要硬件的支持才能完成,所以要實(shí)現(xiàn)以上功能,必須是以硬件同等發(fā)展為前提的。而近些年,人們就可以切身體會(huì)到硬件的變化,手機(jī)內(nèi)存卡容量的不斷增大,電阻屏向多點(diǎn)式電容屏的轉(zhuǎn)變,還有各種芯片運(yùn)算速率的不斷加快,攝像頭像素的不斷細(xì)化,使得上述需求得到更有利的滿足。正是在這樣的背景之下,谷歌公司在2005年推出了第一代安卓智能手機(jī)操作系統(tǒng)。經(jīng)過(guò)8年的發(fā)展,我們驚奇的發(fā)現(xiàn),如今在電腦上流行的社交,娛樂(lè)等應(yīng)用程序,可以同樣的在安卓手機(jī)上運(yùn)行,所以,當(dāng)電腦上的應(yīng)用軟件更新的時(shí)候,也意味著你的手機(jī)應(yīng)用軟件需要更新了。于是,人們終于感受到“PC機(jī)最終會(huì)手機(jī)化,而手機(jī)終將會(huì)PC機(jī)化”這種預(yù)言,這并不是一種矛盾,而是信息革命前行之路上的必然,只有更滿足人們使用習(xí)慣,使用快捷方便的形式和工具才能不被淘汰,繼續(xù)發(fā)展,“優(yōu)勝劣汰”在這里同樣適用。手機(jī)地圖應(yīng)用軟件正是一款滿足人們需求的軟件,通過(guò)它,人們不僅能隨時(shí)隨地知道自己的位置,還能方便的查詢附近的餐館,商店以及汽車站等信息,大大地改善了我們的生活質(zhì)量。而在幾十年前,對(duì)于個(gè)人開(kāi)發(fā)者來(lái)說(shuō),要開(kāi)發(fā)一款手機(jī)地圖幾乎不太現(xiàn)實(shí),因?yàn)樵诋?dāng)時(shí),手機(jī)開(kāi)發(fā)者要實(shí)現(xiàn)地圖服務(wù),大多數(shù)需要GPS傳感器支持,與此同時(shí)還要支付某些地圖所有者相關(guān)費(fèi)用。而如今,只需要申請(qǐng)簡(jiǎn)單的密鑰,程序員就可以輕松免費(fèi)地調(diào)用谷歌或者百度等大型公司的地圖服務(wù),而在安卓系統(tǒng)上,開(kāi)發(fā)地圖也不再需要直接控制GPS,而是基于Web上的開(kāi)發(fā)。這樣,不僅省去了和地圖開(kāi)發(fā)商溝通的人力物力,而且使程序員能更有效、更集中在軟件開(kāi)發(fā)本身。因此,基于安卓系統(tǒng)的手機(jī)地圖應(yīng)用軟件開(kāi)發(fā)是十分有意義的,它不僅能讓初學(xué)者更好的了解安卓系統(tǒng),熟悉安卓開(kāi)發(fā)的完整過(guò)程,還能培養(yǎng)我們面對(duì)用戶需求,分析并解決問(wèn)題的能力,加強(qiáng)我們分析市場(chǎng),并根據(jù)市場(chǎng)導(dǎo)向及時(shí)有效地制定方案的洞察力,為我們不如社會(huì),走向工作崗位提供強(qiáng)有力的實(shí)踐基礎(chǔ)。1.2安卓發(fā)展歷史(1)2005年Google收購(gòu)了剛剛成立了22個(gè)月的Android公司。(2)2007年11月5日,以Google為首的34家公司宣布成立開(kāi)放手機(jī)聯(lián)盟(OpenHandsetAlliance,簡(jiǎn)稱OHA)。(3)2008年9月22日,美國(guó)運(yùn)營(yíng)商T-MobileUSA在紐約正式發(fā)布第一款Google手機(jī)——T-MobileG1。下面,將用表格的形式來(lái)說(shuō)明安卓不同版本的相關(guān)變化。表1-1Android各大版本功能及相關(guān)變化Android版本號(hào)相關(guān)功能1.02.03.04.0.1AndroidMarket;網(wǎng)頁(yè)瀏覽器;照相機(jī)支持;E-mail傳輸;聲音識(shí)別;支持Wi-Fi和藍(lán)牙優(yōu)化硬件速度;支持更多屏幕分辨率;改良用戶界面;內(nèi)置相機(jī)閃光燈;改進(jìn)虛擬鍵盤(pán);支持動(dòng)態(tài)界面設(shè)計(jì)僅供平板電腦使用;GoogleeBooks;GoogleTalk視訊功能;支持多核心處理器統(tǒng)一了手機(jī)和平板電腦使用的系統(tǒng),應(yīng)用會(huì)根據(jù)設(shè)備自動(dòng)選擇最佳顯示方式;提升硬件性能,系統(tǒng)優(yōu)化,流暢度提升;臉部識(shí)別鎖屏;內(nèi)置流量監(jiān)控功能相關(guān)版本的截圖如圖1-1,圖1-2,圖1-3。圖1-1搭載Android2.2Froyo的GoogleNexusOne圖1-2搭載Android2.3Gingerbread的Google'sNexus圖1-3Android4.1Home界面顯示1.3安卓與主流手機(jī)系統(tǒng)當(dāng)今流行的手機(jī)系統(tǒng)中,除了Android系統(tǒng)之外,還有諾基亞的塞班系統(tǒng),蘋(píng)果公司的iOS操作系統(tǒng),微軟公司的WindowsPhone系統(tǒng)以及黑莓的RIM系統(tǒng)。下面,就這幾款軟件與Android作簡(jiǎn)要的對(duì)比:(1)塞班系統(tǒng):Symbian系統(tǒng)是塞班公司為手機(jī)而設(shè)計(jì)的操作系統(tǒng),其優(yōu)點(diǎn)是在安卓出現(xiàn)之前,占有了市場(chǎng)份額的絕大部分,但由于缺乏新技術(shù)支持,駐足不前,導(dǎo)致用戶量驟減。塞班系統(tǒng)具有較完整的功能,并且簡(jiǎn)單易用,對(duì)手機(jī)的內(nèi)存要求比較低,但是其反應(yīng)速度較慢,且并不利于軟件更新,為相關(guān)功能的擴(kuò)展帶來(lái)不便。因此,它被淘汰成為必然。(2)iOS操作系統(tǒng):其全稱是iPhoneOS,其第三方軟件十分豐富,屏幕支持多點(diǎn)式觸摸,可以通過(guò)屏幕對(duì)應(yīng)用進(jìn)行直接的操作,這是蘋(píng)果公司的一大創(chuàng)舉,由于其界面穩(wěn)定友好,受到了廣大用戶的喜愛(ài)。但是其缺點(diǎn)在于,無(wú)論從硬件還是軟件方面,蘋(píng)果公司對(duì)改操作系統(tǒng)進(jìn)行了絕對(duì)的保護(hù),完全封閉了iOS。另外一方面,蘋(píng)果的產(chǎn)品價(jià)格不菲,影響了iOS在低端市場(chǎng)的推廣和發(fā)展。由于Android和iOS十分相似,所以下面將用表格的形式対它們進(jìn)行比較。表1-2AndroidVSiOSAndroidiOS可以在PC,MAC和Linux下開(kāi)發(fā)以Linux為基礎(chǔ)Java25美元可以通過(guò)Web下載應(yīng)用程序支持FlashGoogle,ARM,高通,三星超過(guò)50000個(gè)應(yīng)用程序只能在MAC下開(kāi)發(fā)以MACOS為基礎(chǔ)ObjectiveC每年99美元只能在AppStore下載應(yīng)用程序不支持FlashApple超過(guò)100000個(gè)應(yīng)用程序(3)WindowsPhone8系統(tǒng):目前WindowsPhone機(jī)型的最新版本,僅是諾基亞Lumia610采用的Tango系統(tǒng),也被稱為WP7.5系統(tǒng),但其定位低端,性能一般。AT&T版本的WindowsPhone8機(jī)型,將定位在高端機(jī)、中低端機(jī)兩個(gè)類別,且機(jī)型代號(hào)不盡相同,代號(hào)“Prodigy”的機(jī)型極有可能定位在高端機(jī)型,而代號(hào)“AC/DC”機(jī)型則被限定在中低端行列。它的開(kāi)發(fā)語(yǔ)言是C#,有利于初學(xué)者學(xué)習(xí),但由于發(fā)布時(shí)間較晚,上市機(jī)型偏少等缺點(diǎn),使得其較Android和iOS更缺乏競(jìng)爭(zhēng)力。1.4本文主體結(jié)構(gòu)第一章介紹了應(yīng)用系統(tǒng)的開(kāi)發(fā)背景和開(kāi)發(fā)意義,簡(jiǎn)要敘述了Android系統(tǒng)的發(fā)展歷史,同時(shí)深入比較了安卓系統(tǒng)同其他主流手機(jī)操作系統(tǒng)的區(qū)別。第二章詳細(xì)地介紹了安卓系統(tǒng),其中包括SDK的介紹,系統(tǒng)應(yīng)用程序的組成,系統(tǒng)應(yīng)用程序的體系結(jié)構(gòu),為以后章節(jié)的開(kāi)發(fā)奠定了基礎(chǔ)。第三章首先介紹了系統(tǒng)應(yīng)用需要的開(kāi)發(fā)工具——Eclipse,然后詳細(xì)的說(shuō)明了開(kāi)發(fā)應(yīng)用所需要搭建的環(huán)境,最后簡(jiǎn)要介紹了虛擬機(jī)的使用方法。第四章首先介紹了手機(jī)地圖的開(kāi)發(fā)方法和步驟,同時(shí)說(shuō)明了開(kāi)發(fā)的理念和本款軟件的優(yōu)勢(shì)。其次,分析了功能需求,初步設(shè)定了軟件所需要的基本功能。最后,把軟件合理模塊化,將系統(tǒng)的程序流程圖繪制完成。第五章首先展示了手機(jī)地圖的整體界面,然后逐一介紹了各大功能的實(shí)現(xiàn)方法,最后展現(xiàn)了調(diào)試結(jié)果。第六章總結(jié)了本文的相關(guān)工作,指出了應(yīng)用軟件的很多疏漏和需要改進(jìn)的地方,對(duì)安卓系統(tǒng)應(yīng)用以及本文軟件的前景作出了展望。
2安卓系統(tǒng)簡(jiǎn)介2.1安卓SDK學(xué)過(guò)Java的人都知道,AndroidSDK類似于JDK,它的全稱是AndroidSoftwareDevelopmentKit,即安卓系統(tǒng)的軟件開(kāi)發(fā)工具包。這個(gè)開(kāi)發(fā)包可以從相關(guān)網(wǎng)址經(jīng)行下載,其中,官方版網(wǎng)址為/sdk/index.html。AndroidSDK管理器提供了3個(gè)平臺(tái)的版本:Windows、Linux(i386)和MacOSX(Intel),下載時(shí)可以根據(jù)目標(biāo)平臺(tái)選擇相應(yīng)的SDK進(jìn)行下載。2.1.1AndroidSDK內(nèi)容打開(kāi)下載并安裝好的SDK,可以看到文件夾中含有如圖2-1所示的一些子文件夾。圖2-1SDK包含的文件下面就這些文件作簡(jiǎn)要的介紹[1]:(1)docs文件夾中包含的是完整的AndroidSDK參考文檔,包括SDK發(fā)布的歷史信息(主要包括該版本的亮點(diǎn)和與上一版本的API差異報(bào)告)、開(kāi)發(fā)引導(dǎo)和API參考。(2)tools文件夾中存放的是SDK附帶的Android平臺(tái)的公用工具,如Android模擬器、SQLite數(shù)據(jù)庫(kù)工具等。(3)platform-tools文件夾中存放的是與平臺(tái)有關(guān)的工具,如調(diào)試橋接工具、Dalvik字節(jié)碼轉(zhuǎn)換工具、Android資源打包工具等。(4)samples文件夾中存放的是相關(guān)的開(kāi)發(fā)實(shí)例,初級(jí)開(kāi)發(fā)者可以通過(guò)這些實(shí)例代碼更好地理解安卓應(yīng)用程序的實(shí)現(xiàn)過(guò)程。2.1.2AndroidAPI核心包分析從安裝系統(tǒng)平臺(tái)的最底層到最高層的基本核心API包有如下[2-3]:(1)Android.util:包含一些底層輔助類,例如,特定的容器類、XML輔助工具類等。(2)Android.os:提供基本的操作服務(wù),消息傳遞和進(jìn)程間通信IPC。(3)Android.graphics:作為核心渲染包,提供圖形渲染功能。(4)Android.text、Android.text.method、Android.test.style、Android.test.util:提供一套豐富的文本處理工具,支持富文本,輸入模式等。(5)Android.database:包含底層API處理數(shù)據(jù)庫(kù),方便操作數(shù)據(jù)庫(kù)表和數(shù)據(jù)。(6)Android.content:提供各種服務(wù)訪問(wèn)數(shù)據(jù)在手機(jī)設(shè)備上,程序安裝到手機(jī)設(shè)備和其他的相關(guān)資源,以及內(nèi)容提供展示動(dòng)態(tài)數(shù)據(jù)。(7)Android.view:核心用戶界面框架。(8)Android.widget:提供標(biāo)準(zhǔn)用戶界面元素,list(列表),button(按鈕),layoutmanagers(布局管理器)等,以上是組成我們界面的基本元素。(9)Android.app:提供高層應(yīng)用程序模型,實(shí)現(xiàn)使用Activity。(10)Avide:提供方便調(diào)用系統(tǒng)提供的contentproviders的接口。(11)Android.telephony:提供API系統(tǒng)交互和手機(jī)設(shè)備的通話接口。(12)Android.webikit:包含一系列工作在基于web內(nèi)容的API。除了以上面介紹的這些核心包外,Android還提供了一些可選的API,如:GPS的API-LBS定位服務(wù)(Location-BasedService),可以通過(guò)集成的GPS芯片來(lái)接收衛(wèi)星信號(hào),從而確定手機(jī)的位置;多媒體接口(MediaAPIs)Android平臺(tái)集成了很多影音解碼器及相關(guān)的多媒體API,通過(guò)這些可選的API,開(kāi)發(fā)者可以讓手機(jī)支持MP3、MP4、高清晰視頻播放等;圖形處理API,Android平臺(tái)上的游戲娛樂(lè)功能,可以支持3D游戲;低級(jí)硬件訪問(wèn),這個(gè)功能主要用于控制手機(jī)的底層方面操作[4]。2.1.3AndroidSDK提供的工具包Google公司為Android開(kāi)發(fā)平臺(tái)提供Android模擬器和Eclipse的Android開(kāi)發(fā)工具插件,AndroidSDK也包含了各種在模擬器用于調(diào)試、打包和安裝的工具,其針對(duì)不同的使用場(chǎng)景,能帶來(lái)很多便利[5]。(1)Android系統(tǒng)模擬器(AndroidEmulator):一個(gè)運(yùn)行在計(jì)算機(jī)上的虛擬移動(dòng)模擬器,可以使用模擬器在一個(gè)實(shí)際的Android運(yùn)行環(huán)境下設(shè)計(jì),調(diào)試和測(cè)試用戶的應(yīng)用程序。(2)集成開(kāi)發(fā)環(huán)境插件:用于Eclipse集成開(kāi)發(fā)環(huán)境的Android系統(tǒng)應(yīng)用開(kāi)發(fā)工具插件,它為Eclipse集成開(kāi)發(fā)環(huán)境增加了強(qiáng)大的功能,使得創(chuàng)建和調(diào)試Android應(yīng)用程序更加簡(jiǎn)單和快速。(3)調(diào)試系統(tǒng)監(jiān)視服務(wù):它集成在Dalvik(Android平臺(tái)的虛擬機(jī))中,用于管理運(yùn)行在模擬器或設(shè)備上的進(jìn)程,并協(xié)助進(jìn)行調(diào)試??梢杂盟鼇?lái)去除進(jìn)程、選擇一個(gè)特定程序來(lái)調(diào)試、生產(chǎn)跟蹤數(shù)據(jù)、查看堆和線程數(shù)據(jù)、對(duì)模擬器或設(shè)備進(jìn)行屏幕快照等。(4)Android系統(tǒng)調(diào)試橋:它用于向模擬器或手機(jī)設(shè)備安裝應(yīng)用程序的Apk文件和從命令行訪問(wèn)模擬器或手機(jī)設(shè)備。也可以用于將標(biāo)準(zhǔn)的調(diào)試器連接到運(yùn)行在Android模擬器或手機(jī)設(shè)備上的應(yīng)用代碼。2.2安卓系統(tǒng)的應(yīng)用程序組成開(kāi)發(fā)安卓系統(tǒng)應(yīng)用程序之前,了解其組成是十分重要的,幾乎所有的應(yīng)用程序都包含如下幾個(gè)方面的內(nèi)容:Activity、BroadcastIntentReceive、Service、ContentProvider。當(dāng)然,在某些特殊情況,取上述四大部分的三大部分內(nèi)容便可完成一個(gè)完整的應(yīng)用程序開(kāi)發(fā)。2.2.1Activity首先,必須弄清楚Activity的具體含義。其實(shí),Activity相當(dāng)于一個(gè)應(yīng)用程序的門面,也即一個(gè)屏幕就是一個(gè)Activity。每個(gè)Activity有序的組合、跳轉(zhuǎn)便構(gòu)成了一個(gè)應(yīng)用程序。每個(gè)Activity都有相應(yīng)的生命周期,分別是產(chǎn)生、運(yùn)行和銷毀。在Android系統(tǒng)中為了在各個(gè)Activity之間進(jìn)行跳轉(zhuǎn)可以使用Intent,Intent中兩個(gè)最重要的部分是Intent的動(dòng)作(Action)和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)(data)[6]。此外還有一個(gè)IntentFilter類,它與Intent有著密切的關(guān)系,IntentFilter類是用來(lái)描述Intent請(qǐng)求的,如果有一個(gè)Intent的有效請(qǐng)求,那么IntentFilter就會(huì)被用來(lái)描述一個(gè)Activity操縱那個(gè)Intent。2.2.2BroadcastIntentReceiver顧名思義,這是一種事件響應(yīng)的機(jī)制,即對(duì)程序的某種指令做出響應(yīng),并通知其他應(yīng)用程序。有些BroadcastIntentReceiver需要在AndroidManifest.xml文件中注冊(cè)以后才能被系統(tǒng)執(zhí)行,但有些在系統(tǒng)開(kāi)啟的時(shí)候會(huì)自動(dòng)執(zhí)行。這是一種很重要的響應(yīng)機(jī)制,它使得應(yīng)用程序有了動(dòng)態(tài)和廣播的特性。2.2.3ServiceService是用來(lái)處理耗時(shí)比較長(zhǎng)的操作,它不同于Activity,它是一個(gè)應(yīng)用程序組件,沒(méi)有圖形化的界面,不是一個(gè)單獨(dú)的進(jìn)程。正如字面意思一樣,它類似于一個(gè)后臺(tái)服務(wù)者。在安卓系統(tǒng)中,啟動(dòng)一個(gè)Service的方法是調(diào)用StartService(Intentservice)方法,啟動(dòng)之后就可以控制后臺(tái)程序的運(yùn)行了。2.2.4ContentProviderContentProvider是一個(gè)強(qiáng)大的獲取數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)的接口。如果兩個(gè)應(yīng)用程序需要交換數(shù)據(jù),ContentProvider是必不可少的。用ContentProvider的好處在于,外界可以通過(guò)這個(gè)接口方便地對(duì)數(shù)據(jù)進(jìn)行增,刪,改,查操作。常用的接口有:(1)query(Uri,String[],String[],String):通過(guò)關(guān)鍵字查詢數(shù)據(jù)[5-8]。(2)insert(Uri,ContentValues):將一組數(shù)據(jù)插入到指定的地方。(3)update(Uri,ContentValues,String,String[]):更新數(shù)據(jù)。(4)delete(Uri,String,String[]):刪除數(shù)據(jù)。2.3安卓系統(tǒng)的應(yīng)用程序體系結(jié)構(gòu)要了解安卓系統(tǒng)的應(yīng)用程序體系結(jié)構(gòu),首先需要明白其基礎(chǔ)框架結(jié)構(gòu)。圖2-2為Google官方網(wǎng)站提供的一張安卓的體系結(jié)構(gòu)圖。圖2-2安卓系統(tǒng)體系結(jié)構(gòu)圖由這張圖可以知道,軟件的結(jié)構(gòu)從下往上依次是:(1)基于Linux內(nèi)核的操作系統(tǒng):它包括了一些顯示器的驅(qū)動(dòng)程序、照相機(jī)的驅(qū)動(dòng)程序以及閃存的驅(qū)動(dòng)程序等等。(2)庫(kù)和運(yùn)行時(shí)環(huán)境:庫(kù)中包括一些程序包,大多數(shù)是用C或C++編寫(xiě)并封裝的;安卓的運(yùn)行時(shí)環(huán)境和Java的類似,包括了核心包、開(kāi)發(fā)中常用的類庫(kù)(如IO,Utility等類)、一個(gè)針對(duì)手機(jī)優(yōu)化過(guò)的虛擬機(jī)。(3)應(yīng)用程序框架:提供了一些手機(jī)開(kāi)發(fā)最基本的API,程序員開(kāi)發(fā)工作主要是基于這個(gè)框架之上的。(4)應(yīng)用程序:程序員開(kāi)發(fā)的程序便在這個(gè)層上。
3開(kāi)發(fā)工具及系統(tǒng)環(huán)境搭建3.1開(kāi)發(fā)工具簡(jiǎn)介學(xué)過(guò)Java的人都用過(guò)Eclipse,這是一款功能強(qiáng)大的軟件,是一個(gè)開(kāi)放源代碼的、基于Java的可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。另外,Eclipse附帶了一個(gè)標(biāo)準(zhǔn)的插件集,最新的版本還附帶了ADT等開(kāi)發(fā)工具。Eclipse官方下載網(wǎng)站是:/downloads/。圖3-1為其界面。圖3-1Eclipse界面從這張圖便可以看出,Eclipse是一款界面友好的開(kāi)發(fā)軟件,它強(qiáng)大的功能使得程序員不用花費(fèi)大量時(shí)間和精力在語(yǔ)法上,這樣有利于節(jié)約時(shí)間,提高開(kāi)發(fā)效率。因此,Eclipse越來(lái)越受開(kāi)發(fā)者的青睞。3.2開(kāi)發(fā)環(huán)境搭建本文的開(kāi)發(fā)環(huán)境為Windows7,為開(kāi)發(fā)安裝的相關(guān)軟件包括Eclipse最新版、AndroidSDK、JDK1.6。下面簡(jiǎn)要介紹環(huán)境搭建的一般步驟:(1)JDK的下載:官方網(wǎng)站/technetwork/java/javase/downloads/index.html。安裝好JDK后,有一個(gè)細(xì)節(jié)需要注意,那就是環(huán)境變量的更改。鼠標(biāo)右擊“我的電腦”,選擇“屬性”,在彈出的對(duì)話框中選擇“高級(jí)系統(tǒng)設(shè)置”,再在彈出對(duì)話框選擇“環(huán)境變量”,接下來(lái)你就可以設(shè)置相關(guān)路徑了。(2)安裝Eclipse。下載完成后,一般是以壓縮包的形式呈現(xiàn)在用戶面前,只要解壓縮就可以使用了。第一次開(kāi)啟Eclipse最好設(shè)定一個(gè)統(tǒng)一的工作路徑,這樣有利于以后的開(kāi)發(fā)工作。(3)安裝AndroidSDK。下載網(wǎng)址為:/sdk/index.html。要特別注意,新版的SDK已經(jīng)包括以下內(nèi)容:Eclipse+ADTplugin、AndroidSDKTools、AndroidPlatform-tools、ThelatestAndroidplatform、ThelatestAndroidsystemimagefortheemulator。所以本文介紹的很多工具的下載和安裝方法應(yīng)該合理進(jìn)行參考。(4)安裝ADT。ADT是Google為Android開(kāi)發(fā)者提供的一個(gè)開(kāi)發(fā)Android應(yīng)用程序的Eclipse插件,開(kāi)發(fā)者通過(guò)ADT可以方便的穿件Android項(xiàng)目,創(chuàng)建應(yīng)用程序界面,在基于Android框架API的基礎(chǔ)上添加組件,以及用SDK工具調(diào)試應(yīng)用程序,甚至導(dǎo)出簽名的APKs以便發(fā)行應(yīng)用程序。ADT有兩種安裝形式,一種是在線安裝,另一種是先下載ADT,在來(lái)安裝ADT。本文選擇先下載ADT后再進(jìn)行安裝。3.3虛擬機(jī)簡(jiǎn)介安卓系統(tǒng)虛擬設(shè)備(AndroidVirtualDevice)簡(jiǎn)稱AVD。是專門為安卓開(kāi)發(fā)而構(gòu)建的一個(gè)安卓模擬器,圖3-2為其界面。圖3-2AVD界面由于最新版的Eclipse是自帶ADT的,程序員的主要任務(wù)是設(shè)置虛擬機(jī)的相關(guān)參數(shù)。在Eclipse中點(diǎn)擊AndroidVirtualDeviceManager,在彈出的對(duì)話框中選擇New,在彈出的對(duì)話框中輸入一個(gè)AVDName,選擇Device、Target、CPU/ABT的種類,SDCard的容量選擇250M便足夠開(kāi)發(fā)使用,單擊“OK”完成創(chuàng)建。每個(gè)AVD模擬了一套虛擬設(shè)備來(lái)運(yùn)行Android平臺(tái),這個(gè)平臺(tái)至少有自己的內(nèi)核,系統(tǒng)圖像和數(shù)據(jù)分區(qū),還可以有自己的SD卡和用戶數(shù)據(jù)以及外觀顯示等。但是虛擬機(jī)有一些缺點(diǎn),如它不能模擬手機(jī)的Wi-Fi功能,所以很多涉及Wi-Fi操作的功能開(kāi)發(fā)不能順利進(jìn)行;其次,啟動(dòng)模擬器需要比較長(zhǎng)的時(shí)間,而且它會(huì)占用比較多的資源。所以,要求開(kāi)發(fā)者的個(gè)人電腦滿足主頻至少在2.5以上的CPU,2G以上的內(nèi)存空間。
4安卓系統(tǒng)手機(jī)地圖設(shè)計(jì)4.1開(kāi)發(fā)方法及步驟一個(gè)應(yīng)用軟件的開(kāi)發(fā)初期,絕對(duì)不能盲目的進(jìn)行代碼編寫(xiě),必須先弄清楚用戶需求,計(jì)劃好軟件的總體架構(gòu),為后期的開(kāi)發(fā)作指導(dǎo)。下面就具體分析安卓開(kāi)發(fā)所應(yīng)具備的一般步驟[9]:(1)應(yīng)用程序功能:在應(yīng)用程序編碼之前,就應(yīng)充分考慮到用戶的需求,明確所要達(dá)到的目的,以及為了達(dá)到這些目的應(yīng)用程序應(yīng)具有的基本功能。本程序的基本功能為:記錄用戶移動(dòng)線路、將軌跡顯示在Map上、地圖功能等。(2)應(yīng)用程序所需要的界面以及界面之間跳轉(zhuǎn)的流程:在這個(gè)階段應(yīng)分析應(yīng)用程序?yàn)檫_(dá)到目的,在實(shí)現(xiàn)功能過(guò)程中的流程,以及所需要的界面和界面之間的跳轉(zhuǎn)流程。(3)應(yīng)用程序所需要的數(shù)據(jù)及其數(shù)據(jù)的來(lái)源和格式:在這個(gè)階段應(yīng)深入分析為完成應(yīng)用程序的功能所必需具備的數(shù)據(jù),數(shù)據(jù)的格式、來(lái)源、用途以及存儲(chǔ)方式等。(4)應(yīng)用程序是否需要服務(wù)端支持:在這個(gè)階段需要考慮應(yīng)用程序在使用過(guò)程中是否需要服務(wù)器端的支持,如果需要應(yīng)該為其提供服務(wù)器端的支持。(5)應(yīng)用程序是否需要本地?cái)?shù)據(jù)庫(kù)支持:在這個(gè)階段需要考慮應(yīng)用程序是否需要本地?cái)?shù)據(jù)庫(kù)的支持,以及數(shù)據(jù)支持的方式,如果需要應(yīng)該為其提供本地?cái)?shù)據(jù)庫(kù)的支持。(6)應(yīng)用程序是否需要特殊的權(quán)限:在這個(gè)階段需要考慮應(yīng)用程序在使用過(guò)程中的各種場(chǎng)景,是否有特殊場(chǎng)景需要特殊的權(quán)限,如果需要應(yīng)該設(shè)計(jì)權(quán)限。(7)應(yīng)用程序是否需要后臺(tái)進(jìn)程:在這個(gè)階段需要考慮應(yīng)用程序的應(yīng)用方式,是否在使用過(guò)程中需要調(diào)用后臺(tái)進(jìn)程,如果需要應(yīng)該為其設(shè)計(jì)合適的后臺(tái)進(jìn)程。4.2設(shè)計(jì)理念在設(shè)計(jì)該應(yīng)用程序之初,就應(yīng)該分析設(shè)計(jì)該程序所能產(chǎn)生的效應(yīng),即應(yīng)用軟件所具備的優(yōu)勢(shì)?,F(xiàn)今的主流地圖軟件包括Google地圖、百度地圖、高德地圖等。這些軟件功能已經(jīng)十分強(qiáng)大,那么如果在功能上耗費(fèi)時(shí)間和精力是沒(méi)有成效和市場(chǎng)的。用過(guò)這些軟件的人應(yīng)該知道,這些地圖在中高端手機(jī)上運(yùn)行時(shí)沒(méi)有問(wèn)題,但是面對(duì)中低端智能手機(jī),它們的缺點(diǎn)就凸顯出來(lái)了,那就是運(yùn)行比較緩慢甚至出現(xiàn)卡機(jī)的現(xiàn)象。所以,該款軟件的優(yōu)勢(shì)應(yīng)該在于簡(jiǎn)易靈巧且功能完善,如果后期制作允許,還應(yīng)該致力于界面設(shè)計(jì),因?yàn)橐豢罱缑嬗押玫能浖鶗?huì)得到用戶的青睞。因此,本文所涉及的這款軟件旨在針對(duì)中低端智能手機(jī)市場(chǎng),設(shè)計(jì)理念是盡量易于運(yùn)行且功能完善,界面美觀。4.3功能模塊分析本文將實(shí)現(xiàn)一個(gè)功能比較完備的手機(jī)地圖軟件,該應(yīng)用程序可以如下功能。(1)我的地圖功能:包括截圖,設(shè)置旋轉(zhuǎn)角度,設(shè)置俯視等小功能。該功能主要為了方便用戶對(duì)地圖進(jìn)行合適角度的(2)實(shí)時(shí)定位功能:這是每款軟件的基礎(chǔ)功能,也是核心功能,它能讓用戶時(shí)刻知道自己身處的位置繪制。(3)繪制圖形功能:包括點(diǎn)的繪制,圓形的繪制以及矩形的繪制。這樣可以方用戶進(jìn)行范圍設(shè)定和相關(guān)幾何運(yùn)算。(4)地圖標(biāo)記功能:支持多地點(diǎn)的標(biāo)記,用戶可以根據(jù)自己的需求對(duì)相關(guān)地點(diǎn)進(jìn)行標(biāo)識(shí)。(5)地點(diǎn)搜索功能:該應(yīng)用程序還具有地點(diǎn)搜索功能,如果輸入某一關(guān)鍵字,地圖將在市區(qū)內(nèi)搜索帶有次關(guān)鍵字的所有地點(diǎn),這樣,用戶可以進(jìn)行相應(yīng)的選擇。(6)公交查詢功能:為用戶提供城市部分公交路線圖。(7)離線地圖功能:為用戶提供某些城市的地圖下載,這樣,可以有效的節(jié)省用戶流量,能得到用戶的喜歡。4.4系統(tǒng)模塊分析(1)我的地圖功能模塊:其中截圖功能會(huì)把用戶所截圖片存放在默認(rèn)的圖片收藏夾里,可以方便在圖庫(kù)里進(jìn)行查看。另外,系統(tǒng)默認(rèn)把地圖旋轉(zhuǎn)45度,俯視角為45度,當(dāng)然用戶可以根據(jù)自己的喜好自行修改旋轉(zhuǎn)角度及俯視角度。(2)實(shí)時(shí)定位功能模塊:這個(gè)功能對(duì)手機(jī)的網(wǎng)絡(luò)要求比較高,當(dāng)用戶點(diǎn)擊實(shí)時(shí)更新按鈕的時(shí)候,地圖會(huì)自動(dòng)定位用戶所在的地點(diǎn),并用藍(lán)色小圓點(diǎn)進(jìn)行標(biāo)識(shí)。(3)繪制圖形功能模塊:內(nèi)包含六個(gè)按鈕,“繪制點(diǎn)”,“繪制線”,“繪制矩形”,“繪制圓”,“移除矩陣”以及“清除所有”。點(diǎn)擊“繪制點(diǎn)”,系統(tǒng)將繪制一個(gè)淺藍(lán)色的小圓點(diǎn);點(diǎn)擊“繪制線”,系統(tǒng)將繪制一條紅色的折線;點(diǎn)擊“繪制矩陣”,系統(tǒng)將繪制一個(gè)淺紫色的矩形框;點(diǎn)擊“繪制圓”,系統(tǒng)將繪制一個(gè)淺綠色的圓形。重復(fù)點(diǎn)擊這些按鈕,所有種類的顏色都會(huì)加深。(4)地圖標(biāo)記功能模塊:該模塊具有三個(gè)按鈕——“添加標(biāo)記”,“清楚一個(gè)標(biāo)記”以及“清除所有”。當(dāng)點(diǎn)擊“添加標(biāo)記”按鈕時(shí),地圖會(huì)出現(xiàn)一個(gè)“A”字樣的紅色標(biāo)識(shí)氣泡,再次點(diǎn)擊可以得到一個(gè)“B”字樣的紅色氣泡標(biāo)識(shí),以此類推。點(diǎn)擊“清除一個(gè)標(biāo)記”,會(huì)清除剛才產(chǎn)生的末尾標(biāo)記,持續(xù)點(diǎn)擊,將逆序清除標(biāo)識(shí)。點(diǎn)擊“清除所有”,所有標(biāo)識(shí)一次性清除。(5)地點(diǎn)搜索功能模塊:系統(tǒng)默認(rèn)在“西安”市內(nèi)找“大學(xué)”,即當(dāng)用戶點(diǎn)擊開(kāi)始按鈕時(shí),系統(tǒng)會(huì)搜索西安市內(nèi)的所有大學(xué)。(6)公交查詢功能模塊:系統(tǒng)默認(rèn)查詢“西安”市內(nèi)的“336”公交車,用戶也可以根據(jù)自己的需要輸入其他城市進(jìn)行查詢。點(diǎn)擊“開(kāi)始”按鈕,系統(tǒng)將繪制出“336”;路公交車的行駛路線。(7)離線地圖功能模塊:為用戶提供某些城市的地圖下載,這樣,可以有效的節(jié)省用戶流量,能得到用戶的喜歡。程序的系統(tǒng)模塊如圖4-1。圖4-1程序系統(tǒng)模塊4.5程序流程圖開(kāi)發(fā)人員都知道,Android系統(tǒng)的應(yīng)用程序的頁(yè)面是基于Activity跳轉(zhuǎn)的,當(dāng)程序在不同的頁(yè)面之間轉(zhuǎn)換的時(shí)候,Activity也在進(jìn)行著跳轉(zhuǎn),而Activity的跳轉(zhuǎn)則在代碼層帶動(dòng)程序功能的實(shí)現(xiàn),因此為了順利的完成程序,必須對(duì)程序的流程和程序的頁(yè)面和Activity跳轉(zhuǎn)流程有清晰的了解。程序的流程本文將用流程圖來(lái)展示,而本程序的Activity的跳轉(zhuǎn)相對(duì)直接明了,因此只做簡(jiǎn)要說(shuō)明和分析。結(jié)合之前的設(shè)計(jì),先用流程圖來(lái)分析整個(gè)程序的運(yùn)行過(guò)程,在弄清楚運(yùn)行過(guò)程之后,再用例圖來(lái)分析用戶與程序頁(yè)面的交互情況,從用例圖的交互分析來(lái)得到程序頁(yè)面的跳轉(zhuǎn)流程以及程序的Activity跳轉(zhuǎn)流程。4.5.1應(yīng)用程序流程跳轉(zhuǎn)點(diǎn)擊模擬器中的個(gè)人地圖程序“曉偉地圖”,程序運(yùn)行后會(huì)打開(kāi)一個(gè)主界面,用戶在主界面進(jìn)行選擇后再進(jìn)行各種操作。程序的大致框圖如圖4-2。圖4-2程序框圖4.5.2應(yīng)用程序流程跳轉(zhuǎn)以及Activity分析根據(jù)之前的程序流程分析再結(jié)合程序的功能和頁(yè)面使用用例圖分析程序的頁(yè)面跳轉(zhuǎn),程序的用例圖如圖4-3。圖4-3程序的用例分析由上圖可知,在頁(yè)面的跳轉(zhuǎn)過(guò)程中,會(huì)有四個(gè)Activity伴隨著頁(yè)面的跳轉(zhuǎn)而發(fā)生變化,分別是MyMap、MyPoi、Itemized、MarkPoi、Search、Busline、Offline七個(gè)Activity,為此應(yīng)在程序中設(shè)置Activity跳轉(zhuǎn)算法,跳轉(zhuǎn)算法如下:Intentintent=newIntent();switch(item.getItemId()){caseMENU_MYMAP:intent.setClass(XiaoMap.this,MyMap.class);startActivity(intent);returntrue;caseMENU_MYPOI:intent.setClass(XiaoMap.this,MyPoi.class);startActivity(intent);returntrue;caseMENU_ITEMIZED:intent.setClass(XiaoMap.this,Itemized.class);startActivity(intent);returntrue;caseMENU_MARKPOI:intent.setClass(XiaoMap.this,MarkPoi.class);startActivity(intent);returntrue;caseMENU_SEARCH:intent.setClass(XiaoMap.this,Search.class);startActivity(intent);returntrue;caseMENU_BUSLINE:intent.setClass(XiaoMap.this,Busline.class);startActivity(intent);returntrue;caseMENU_OFFLINE:intent.setClass(XiaoMap.this,Offline.class);startActivity(intent);returntrue;caseMENU_EXIT:finish();break;}returntrue;}
5手機(jī)地圖應(yīng)用軟件的實(shí)現(xiàn)按照之前設(shè)計(jì)好的規(guī)劃,我們將應(yīng)用程序的界面功能先實(shí)現(xiàn),再為應(yīng)用程序添加Service服務(wù)和數(shù)據(jù)的存儲(chǔ)服務(wù),最后將整個(gè)應(yīng)用程序的功能連接起來(lái),完成應(yīng)用程序的開(kāi)發(fā)。在本程序的開(kāi)發(fā)過(guò)程中將依次實(shí)現(xiàn)下列界面以及相關(guān)的服務(wù):主界面、我的地圖界面、實(shí)時(shí)定位界面、繪制圖形界面、地圖標(biāo)記界面、地圖標(biāo)記界面、地點(diǎn)搜索界面、公交查詢界面、離線地圖界面、Service和數(shù)據(jù)庫(kù)服務(wù)、流程連接等。一個(gè)Android的應(yīng)用是由一個(gè)或者多個(gè)Activity組成的,Activity是一個(gè)UI的容器,其本身并不在用戶界面上顯示的。我們?cè)诰唧w編程之前,先簡(jiǎn)單地了解一下,具體編程當(dāng)中用到的UI基本元素以及它們之間是一種什么樣的繼承結(jié)構(gòu)。在Android系統(tǒng)當(dāng)中View類是最基本的一個(gè)UI類,基本上所有的高級(jí)UI組件都是繼承View類而實(shí)現(xiàn)的,在應(yīng)用程序中所需要用到的TextView(文本框)、Button(按鈕)、List(列表)、EditText(編輯框)、RadioButton(多選按鈕)、Checkbox(選擇框)等都是View類。如圖5-1,Android系統(tǒng)的UI組件的樹(shù)形類圖。在Android系統(tǒng)中界面的生產(chǎn)有三種方式:通過(guò)在xml中配置來(lái)生成系統(tǒng)界面、用戶使用自己的界面接口來(lái)生成系統(tǒng)界面、在程序中直接通過(guò)代碼來(lái)生成系統(tǒng)界面。在本程序中通過(guò)程序中編寫(xiě)代碼來(lái)進(jìn)行界面布局。程序的主界面用來(lái)顯示系統(tǒng)的七大功能,在主界面上,布局文件只需要定義一個(gè)“TextView”即可,而在資源文件里,還需要添加幾個(gè)菜單,菜單的作用分別是“退出”和“關(guān)于”。圖5-1安卓系統(tǒng)UI組件的樹(shù)形結(jié)構(gòu)(1)視圖組件(View):一個(gè)視圖在屏幕上占據(jù)了一塊矩形區(qū)域,它負(fù)責(zé)渲染這塊矩形區(qū)域(如將這塊區(qū)域變成藍(lán)色或其他顏色),也可以處理這塊矩形區(qū)域發(fā)送的事件(如用戶單擊了這塊區(qū)域),并且可以設(shè)置這塊區(qū)域是否可見(jiàn),是否可以獲取焦點(diǎn)等。(2)視圖容器組件(Viewgroup):一個(gè)視圖容器對(duì)象是一個(gè)Android.view.Viewgroup的實(shí)例。就像它的名字顯示的意義一樣,Viewgroup的作用就是View的容器,它負(fù)責(zé)對(duì)添加進(jìn)Viewgroup的這些View進(jìn)行布局。當(dāng)然一個(gè)Viewgroup也可以加入到另一個(gè)Viewgroup里邊,因?yàn)閂iewgroup也是繼承于View.Viewgroup類,它是一個(gè)抽象類,也是其他容器類的基類。(3)布局組件:Viewgroup的實(shí)現(xiàn)類比較多,其中最重要的有兩個(gè)實(shí)現(xiàn)類,一個(gè)是LinearLayout,另一個(gè)是RelativeLayout。LinearLayout可以用來(lái)進(jìn)行水平布局或者豎直布局。如果將LinearLayout的布局方向設(shè)置為“vertical”,那么表明是豎直布局。也就是說(shuō)先加入進(jìn)去的View會(huì)顯示在頂端,后續(xù)加入的View會(huì)顯示在底端。如果設(shè)置為“horizontal”,那么表明是水平布局,也就是從左到右依次進(jìn)行排列布局。RelativeLayout負(fù)責(zé)相對(duì)布局,相識(shí)于CSS中的相對(duì)布局,例如,設(shè)置A顯示在B的左側(cè),那么的顯示坐標(biāo)不是固定的,而是相對(duì)于A的位置。(4)布局參數(shù):在將每一個(gè)View加入到這個(gè)RelativeLayout里邊的時(shí)候,我們會(huì)傳遞一組值(如果沒(méi)有傳遞值,那么系統(tǒng)采用的默認(rèn)值),這組值封裝在LayoutParams這個(gè)類當(dāng)中。在顯示這個(gè)View的時(shí)候,它的容器類會(huì)自動(dòng)根據(jù)傳進(jìn)來(lái)的LayoutParams進(jìn)行計(jì)算,來(lái)確認(rèn)這個(gè)View顯示的大小和位置。5.1程序主界面在Android系統(tǒng)中界面的生產(chǎn)有三種方式:通過(guò)在xml中配置來(lái)生成系統(tǒng)界面、用戶使用自己的界面接口來(lái)生成系統(tǒng)界面、在程序中直接通過(guò)代碼來(lái)生成系統(tǒng)界面。在本程序中通過(guò)在程序中編寫(xiě)代碼來(lái)進(jìn)行界面布局。程序的主界面用來(lái)簡(jiǎn)單明了地顯示了系統(tǒng)的七大功能——“我的地圖”,“實(shí)時(shí)定位”,“繪制圖形”,“地圖標(biāo)記”,“地點(diǎn)搜索”,“公交查詢”以及“離線地圖”。在主界面上需要一個(gè)標(biāo)簽(TextView),還需要添加幾個(gè)菜單,菜單的作用分別是“退出”和“關(guān)于”。(1)關(guān)于按鈕:提供本軟件的相關(guān)信息。(2)退出按鈕:選擇退出按鈕,程序?qū)⒆詣?dòng)退出。5.2程序主界面的實(shí)現(xiàn)在資源文件中,新建一個(gè)名為“MainFunction”的java文件,然后再main.xml中定義界面的相關(guān)布局。首先在res/value目錄下的strings.xml文件中添加一些需要用到的字符串的定義,代碼如下:<resources><stringname="app_name">曉偉地圖</string>//用來(lái)定義軟件名稱,這個(gè)標(biāo)記會(huì)在所有的Activity中顯示。<stringname="hello_world">Helloworld!</string><stringname="menu_settings">Settings</string><stringname="title_activity_main">MainActivity</string><stringname="exit">退出</string>//用于使主界面的菜單選項(xiàng)為中文。 <stringname="about">關(guān)于</string> //與上句代碼的意義一致。</resources>其次,編寫(xiě)main.xml中的代碼,代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"http://寬度填滿父控件(整個(gè)屏幕)。android:layout_height="wrap_content"http://內(nèi)容填滿整個(gè)高度。android:orientation="vertical">//設(shè)置布局風(fēng)格為垂直布局。<TextViewandroid:text="歡迎使用曉偉地圖"http://文本文件。android:id="@+id/text_Info"http://設(shè)置文本的名字。 android:layout_width="wrap_content"android:layout_height="wrap_content"></TextView><ListViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/listView"android:apiKey="30AFC67C1388B437734EEF7DC58DCCC70CF6AD41"/></LinearLayout>在main.xml中,需要使用LinearLayout布局,在其中放置一個(gè)TextView組件和ListView組件,其中TextView組件用來(lái)顯示的文字引用“@string/title”,其值是“text_Info”,再增加一個(gè)id為“@+id/android:list”的ListView組件,用來(lái)顯示功能列表。系統(tǒng)會(huì)調(diào)用onCreate方法來(lái)實(shí)現(xiàn)布局的加載,顯示在列表中。為了在主界面上增加“退出”、“關(guān)于”兩個(gè)按鈕,需要程序增加方法onOptionsItemSelected(),下面給出實(shí)現(xiàn)的具體代碼:publicbooleanonCreateOptionsMenu(Menumenu){ //TODOAuto-generatedmethodstub menu.add(0,1,1,R.string.exit);//添加一個(gè)按鈕。 menu.add(0,2,2,R.string.about);//再添加一個(gè)按鈕。 returnsuper.onCreateOptionsMenu(menu); } @OverridepublicbooleanonOptionsItemSelected(MenuItemitem){ //TODOAuto-generatedmethodstub if(item.getItemId()==1){//調(diào)用的是第一個(gè)按鈕。 finish();//點(diǎn)擊退出按鈕時(shí)會(huì)完成退出動(dòng)作。 } returnsuper.onOptionsItemSelected(item);}接著還有一個(gè)比較重要的方法onItemClick,當(dāng)單擊列表中的一個(gè)條目的時(shí)候會(huì)調(diào)用該方法,在該方法中會(huì)獲取被單擊條目的ID、Name和Desc屬性,以綁定(Bundle)的方式傳遞給下一個(gè)活動(dòng),這樣就實(shí)現(xiàn)單擊以往跟蹤記錄條目的時(shí)候會(huì)打開(kāi)一個(gè)新的活動(dòng),將路徑展示在地圖上。打開(kāi)Android系統(tǒng)模擬器,在模擬器運(yùn)行起來(lái)后,在應(yīng)用程序選擇界面上選擇“曉偉地圖”,模擬器運(yùn)行圖如圖5-2。圖5-2模擬器運(yùn)行圖在程序運(yùn)行起來(lái)后,進(jìn)入程序的主界面,點(diǎn)擊模擬器右邊的“MENU”按鈕,在主界面上顯示操作按鈕。程序主界面如圖5-3。圖5-3程序主界面5.3我的地圖功能的實(shí)現(xiàn)當(dāng)在主界面上點(diǎn)擊“我的地圖”按鈕時(shí),會(huì)執(zhí)行以下代碼:publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);Applicationapp=(Application)this.getApplication();if(app.mBMapManager==null){app.mBMapManager=newBMapManager(this);app.mBMapManager.init(Application.strKey,newApplication.MyGeneralListener());}setContentView(R.layout.activity_main);mMapView=(MapView)findViewById(R.id.bmapView);mMapController=mMapView.getController();//MapController用于對(duì)地圖進(jìn)行多種操作方法。initMapView();//初始化mMapController.enableClick(true);mMapController.setZoom(12);//設(shè)置地圖的放大級(jí)別mMapView.setDoubleClickZooming(true);mMapView.setOnTouchListener(null);//設(shè)置監(jiān)聽(tīng)器,觸發(fā)事件mMapListener=newMKMapViewListener(){ @Override publicvoidonMapMoveFinish(){ //在此處理地圖移動(dòng)完成消息回調(diào) }@OverridepublicvoidonClickMapPoi(MapPoimapPoiInfo){ Stringtitle=""; if(mapPoiInfo!=null){ title=mapPoiInfo.strText; Toast.makeText(BaseMapDemo.this,title,Toast.LENGTH_SHORT).show(); mMapController.animateTo(mapPoiInfo.geoPt); }}運(yùn)行此代碼后,“我的地圖”所對(duì)應(yīng)的Activity會(huì)被執(zhí)行,我們將看到如圖5-4界面。圖5-4我的地圖界面其中,截圖功能是調(diào)用onGetCurrentMap(Bitmapb)這個(gè)方法來(lái)實(shí)現(xiàn)的,最后把截取的圖片保存在"/mnt/sdcard/test"目錄下。而為了實(shí)現(xiàn)“旋轉(zhuǎn)”和“俯視”這兩個(gè)功能需要綁定連個(gè)監(jiān)聽(tīng)器,部分代碼如下:OnClickListenerrotateListener=newOnClickListener(){//旋轉(zhuǎn)地圖監(jiān)聽(tīng)器 publicvoidonClick(Viewv){ setMapRotateClick(); }};OnClickListeneroverlookListener=newOnClickListener(){//俯視監(jiān)聽(tīng)器 publicvoidonClick(Viewv){ setMapOverlookingClick(); }}; button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(captureListener); buttonRotate=(Button)findViewById(R.id.button2); buttonRotate.setOnClickListener(rotateListener); buttonOverlook=(Button)findViewById(R.id.button3); buttonOverlook.setOnClickListener(overlookListener); }privatevoidinitMapView(){mMapView.setLongClickable(true);//mMapController.setMapClickEnable(true);//mMapView.setSatellite(false);}//截圖,異步方法publicvoidcaptureMapClick(){ mMapView.getCurrentMap();}//設(shè)置地圖旋轉(zhuǎn)角度publicvoidsetMapRotateClick(){ EditTextrotate=(EditText)findViewById(R.id.rotateangle); mMapView.getController().setRotation(Integer.parseInt(rotate.getText().toString()));}//設(shè)置地圖俯視角度publicvoidsetMapOverlookingClick(){ EditTextoverlooking=(EditText)findViewById(R.id.overlookangle); mMapView.getController().setOverlooking(Integer.parseInt(overlooking.getText().toString()));}通過(guò)這些方法,就實(shí)現(xiàn)了功能所需。5.4實(shí)時(shí)定位功能的實(shí)現(xiàn)當(dāng)在主界面上點(diǎn)擊“實(shí)時(shí)定位”按鈕時(shí),會(huì)執(zhí)行以下代碼:publicclassMyLocationListennerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){if(location==null)return;locData.latitude=location.getLatitude();locData.longitude=location.getLongitude();locData.accuracy=location.getRadius();locData.direction=location.getDerect();myLocationOverlay.setData(locData);mMapView.refresh();mMapController.animateTo(newGeoPoint((int)(locData.latitude*1e6),(int)(locData.longitude*1e6)),mHandler.obtainMessage(1));}運(yùn)行完該部分代碼之后,“實(shí)時(shí)定位”所對(duì)應(yīng)的Activity會(huì)被執(zhí)行,當(dāng)然,與此同時(shí),你需要在布局文件夾中新建一個(gè)Location.xml的布局文件,用來(lái)設(shè)計(jì)該Activity的界面,相關(guān)代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayoutandroid:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><Button android:id="@+id/button1" android:text="實(shí)時(shí)更新" android:layout_width="fill_parent" android:layout_height="wrap_content"/></LinearLayout>由于相關(guān)代碼已經(jīng)在上述的幾個(gè)功能介紹過(guò)了,這里就不在贅述。圖5-4為運(yùn)行結(jié)果。圖5-4定位功能界面5.5繪制圖形功能實(shí)現(xiàn)當(dāng)點(diǎn)擊“繪制圖形”按鈕時(shí),系統(tǒng)會(huì)執(zhí)行Geometry.java文件,代碼如下:publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); Applicationapp=(Application)this.getApplication();if(app.mBMapManager==null){app.mBMapManager=newBMapManager(this);app.mBMapManager.init(Application.strKey,newApplication.MyGeneralListener());}setContentView(R.layout.activity_geometry);mMapView=(MapView)findViewById(R.id.bmapView);initMapView();mMapView.getController().setZoom(13);mMapView.getController().enableClick(true);lineButton=(Button)findViewById(R.id.button1);polygenButton=(Button)findViewById(R.id.button2);circleButton=(Button)findViewById(R.id.button3);pointButton=(Button)findViewById(R.id.button4);removeButton=(Button)findViewById(R.id.button5);clearButton=(Button)findViewById(R.id.button6);graphicsOverlay=newGraphicsOverlay(mMapView);mMapView.getOverlays().add(graphicsOverlay);lineButton.setOnClickListener(drawLineListener);polygenButton.setOnClickListener(drawPolygenListener);circleButton.setOnClickListener(drawCircleListener);pointButton.setOnClickListener(drawpointListener);removeButton.setOnClickListener(removeListener);clearButton.setOnClickListener(clearListener);}同樣的,在布局文件夾中需要新建一個(gè)Geometry.xml布局文件,用來(lái)設(shè)計(jì)該Activity的界面,這里不再重復(fù)給出相關(guān)代碼。結(jié)果如圖5-5。圖5-5繪制圖形界面5.6地圖標(biāo)記功能實(shí)現(xiàn)點(diǎn)擊主界面里的“地圖標(biāo)記”按鈕,系統(tǒng)執(zhí)行Itemized.java文件。代碼如下:publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); Applicationapp=(Application)this.getApplication();if(app.mBMapManager==null){app.mBMapManager=newBMapManager(this);app.mBMapManager.init(Application.strKey,newApplication.MyGeneralListener());}setContentView(R.layout.activity_itemizedoverlay);mMapView=(MapView)findViewById(R.id.bmapView);mMapController=mMapView.getController();initMapView();mMapView.getController().setZoom(13);mMapView.getController().enableClick(true);mMapView.setBuiltInZoomControls(true);testItemButton=(Button)findViewById(R.id.button1);removeItemButton=(Button)findViewById(R.id.button2);removeAllItemButton=(Button)findViewById(R.id.button3);}在布局文件夾中新建一個(gè)Itemized.xml布局文件,系統(tǒng)運(yùn)行狀態(tài)如圖5-6。圖5-6地圖標(biāo)記界面5.7地點(diǎn)搜索功能實(shí)現(xiàn)相比于其他功能,這個(gè)“地點(diǎn)搜索”功能的實(shí)現(xiàn)要復(fù)雜很多,實(shí)現(xiàn)代碼也相對(duì)較多,因此耗費(fèi)了比較長(zhǎng)的時(shí)間。此模塊主要用于實(shí)現(xiàn)兩個(gè)功能,一個(gè)是關(guān)鍵詞搜索地點(diǎn),另外一個(gè)縮小搜索范圍。Applicationapp=(Application)this.getApplication();if(app.mBMapManager==null){app.mBMapManager=newBMapManager(this);app.mBMapManager.init(Application.strKey,newApplication.MyGeneralListener());}setContentView(R.layout.activity_poisearch);mMapView=(MapView)findViewById(R.id.bmapView);initMapView(); publicvoidonClickMapPoi(MapPoimapPoiInfo){ Stringtitle=""; if(mapPoiInfo!=null){ title=mapPoiInfo.strText; Toast.makeText(PoiSearchDemo.this,title,Toast.LENGTH_SHORT).show(); }}圖5-7為運(yùn)行結(jié)果。圖5-7地點(diǎn)搜索界面5.8公交查詢功能實(shí)現(xiàn)當(dāng)點(diǎn)擊“公交查詢”按鈕時(shí),系統(tǒng)會(huì)執(zhí)行以下代碼:protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); Applicationapp=(Application)this.getApplication(); if(app.mBMapManager==null){ app.mBMapManager=newBMapManager(this); app.mBMapManager.init(DemoApplication.strKey,newApplication.MyGeneralListener()); } setContentView(R.layout.buslinesearch);}運(yùn)行完該代碼后,“公交查詢”所對(duì)應(yīng)的Activity會(huì)被執(zhí)行,界面如圖5-8。圖5-8公交查詢界面5.9離線地圖功能實(shí)現(xiàn)這是百度地圖的一個(gè)專屬功能,用過(guò)地圖軟件的人都知道,主流軟件中,Google地圖和高德地圖都沒(méi)有離線地圖功能,而百度地圖可以用手機(jī)直接保存各大城市的詳細(xì)地圖信息,這樣為用戶節(jié)約了大量的流量,這也是百度地圖深受青睞的原因之一。而本文的這款手機(jī)地圖也正是基于為用戶考慮的角度,借鑒了百度離線地圖功能的實(shí)現(xiàn)方法,構(gòu)造了一個(gè)下載界面。但由于這項(xiàng)功能的真正實(shí)現(xiàn)需要龐大數(shù)據(jù)庫(kù)的支持,作為個(gè)人開(kāi)發(fā)者無(wú)從下手,因此,僅提供幾個(gè)實(shí)例作為說(shuō)明。在主界面點(diǎn)擊“離線地圖”按鈕,會(huì)執(zhí)行如下代碼:protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState);DemoApplicationapp=(DemoApplication)this.getApplication();if(app.mBMapManager==null){app.mBMapManager=newBMapManager(this);app.mBMapManager.init(DemoApplication.strKey,newDemoApplication.MyGeneralListener());}setContentView(R.layout.activity_offline);mMapView=(MapView)findViewById(R.id.bmapView);mMapController=mMapView.getController();initMapView(); publicvoidonGetOfflineMapState(inttype,intstate){ switch(type){ caseMKOfflineMap.TYPE_DOWNLOAD_UPDATE: { //Log.d("OfflineDemo",String.format("cityid:%dupdate",state)); MKOLUpdateElementupdate=mOffline.getUpdateInfo(state); if(update!=null) mText.setText(String.format("%s:%d%%",update.cityName,update.ratio)); } break; caseMKOfflineMap.TYPE_NEW_OFFLINE: //Log.d("OfflineDemo",String.format("addofflinemapnum:%d",state)); mText.setText(String.format("新安裝%d個(gè)離線地圖",state)); break; caseMKOfflineMap.TYPE_VER_UPDATE: MKOLUpdateElemente=mOffline.getUpdateInfo(state); if(e!=null){ //Log.d("OfflineDemo",String.format("%dhasnewofflinemap:",e.cityID)); mText.setText(String.format("%s有離線地圖更新",e.cityName)); } break; }}執(zhí)行完此段代碼,系統(tǒng)會(huì)調(diào)用“離線地圖”所對(duì)應(yīng)的Activity,運(yùn)行結(jié)果如圖5-8。圖5-8離線地圖界面
6結(jié)束語(yǔ)6.1總結(jié)隨著科學(xué)技術(shù)的不斷進(jìn)步,人們的生活越發(fā)向著簡(jiǎn)單便捷的方向發(fā)展,而快速的生活節(jié)奏使得移動(dòng)設(shè)備有了更加廣闊的市場(chǎng),因?yàn)樗脻M足了這樣一種時(shí)代潮流。安卓系統(tǒng)只能手機(jī)正是在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級(jí)下冊(cè)語(yǔ)文教學(xué)計(jì)劃
- 聘請(qǐng)英語(yǔ) 顧問(wèn)合同范本
- 2 鄉(xiāng)下人家(教學(xué)設(shè)計(jì))2023-2024學(xué)年部編版語(yǔ)文四年級(jí)下冊(cè)
- 14 《母雞》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版四年級(jí)語(yǔ)文下冊(cè)
- 施工洽商合同范本
- 工資社保合同范本
- 土方清理施工合同范文
- 19《夜宿山寺》教學(xué)設(shè)計(jì)-2024-2025學(xué)年二年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版(五四制)
- 祠堂建造合同范本
- Module 3 Unit 2 Around my home(教學(xué)設(shè)計(jì))-2024-2025學(xué)年牛津上海版(試用本)英語(yǔ)四年級(jí)上冊(cè)
- 黑布林繪本 Dad-for-Sale 出售爸爸課件
- 第2.4節(jié)色度信號(hào)與色同步信號(hào)
- 山東省成人教育畢業(yè)生登記表
- 月度及年度績(jī)效考核管理辦法
- 采購(gòu)訂單模板
- 畢業(yè)設(shè)計(jì)鋼筋彎曲機(jī)的結(jié)構(gòu)設(shè)計(jì)
- 工程結(jié)構(gòu)質(zhì)量特色介紹
- 清華大學(xué)MBA課程——運(yùn)籌學(xué)
- 濕法冶金浸出凈化和沉積PPT課件
- 生產(chǎn)現(xiàn)場(chǎng)作業(yè)十不干PPT課件
- 通信桿路工程施工
評(píng)論
0/150
提交評(píng)論