版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
10 目 錄目 錄第一部分 Android簡(jiǎn)介第1章快速入門 2安裝工具 2Java開發(fā)包7.0+ 2AndroidStudio 3創(chuàng)建第一個(gè)程序 5在Android模擬器中運(yùn)行 8在實(shí)際設(shè)備上運(yùn)行 9其他步驟 10檢查更新 10添加SDK包 10快速閱讀指南 12第2章重要概念 132.1總覽 13Linux內(nèi)核 14原生庫(kù) 14Android運(yùn)行時(shí) 15應(yīng)用框架 15應(yīng)用和服務(wù) 162.2構(gòu)件 162.2.1活動(dòng) 162.2.2片段 162.2.3視圖 172.2.4意圖 172.2.5服務(wù) 17內(nèi)容提供器 18使用資源 18前臺(tái)只能有一個(gè)應(yīng)用 18進(jìn)程不等于應(yīng)用 19活動(dòng)的生命周期 19
使用片段簡(jiǎn)化工作 21安全保障 22快速閱讀指南 22第二部分 開發(fā)一個(gè)游戲第3章開局走法 24創(chuàng)建井字游戲示例 24使用XML進(jìn)行設(shè)計(jì) 25創(chuàng)建主屏幕 25創(chuàng)建主片段 28編寫代碼 31定義主活動(dòng) 31定義主活動(dòng)使用的片段 32添加About框 33定義資源 34字符串 343.5.2尺寸 353.5.3drawable 353.5.4顏色 36樣式和主題 37dp和sp 37運(yùn)行游戲 383.6調(diào)試 38使用日志消息進(jìn)行調(diào)試 39使用調(diào)試器進(jìn)行調(diào)試 403.6.3測(cè)試 403.7快速閱讀指南 41第4章定義游戲界面 424.1棋盤 42從小處著手 42目 錄 xi小棋盤 44背景信息 45大棋盤 47組合在一起 48開始游戲 49使用快捷鍵Alt+Enter 49編寫GameActivity類 50編寫GameFragment類 53定義Tile類 59控制游戲 63支持橫向模式 65快速閱讀指南 67第5章機(jī)器幽靈 68AI簡(jiǎn)介 68AI的工作原理 68形勢(shì)判斷 69模擬思考過程 70使用Handler和postDelayed 70在思考期間阻斷輸入 715.3下棋 73選擇正確的走法 73顏色和尺寸 745.4快速閱讀指南 75第6章添加聲音 76音樂之聲 76更換音樂 78播放下棋聲 79快速閱讀指南 81第7章添加動(dòng)畫 82不斷滾動(dòng)的畫卷 82添加視圖 83定義自定義屬性 83背景信息 83創(chuàng)建滾動(dòng)視圖 84跳躍的棋盤格 86動(dòng)畫原則 867.2.2走起 877.2.3觀看跳躍的棋盤格 88
7.2.4現(xiàn)狀 88快速閱讀指南 89第三部分 創(chuàng)造性思維第8章編寫一次,到處測(cè)試 92啟動(dòng)模擬器 93模擬器反斗城 93測(cè)試策略 95測(cè)試程序 96大小屏幕通吃 98指定替代資源 99調(diào)整游戲界面的大小 1008.3.3預(yù)覽 1018.3.4使用樣式 101快速閱讀指南 102第9章發(fā)布到GooglePlayStore 1039.1準(zhǔn)備工作 1039.2簽名 1049.3測(cè)試 1069.4發(fā)布 1079.5更新 1089.6小貼士 1099.7快速閱讀指南 109第四部分 進(jìn)階第10章聯(lián)網(wǎng) 112使用意圖瀏覽網(wǎng)頁(yè) 112使用WebView來瀏覽網(wǎng)頁(yè) 117在JavaScript和Java之間交互 120快速閱讀指南 127第章調(diào)用Web服務(wù) 128使用Web服務(wù) 128Suggest示例 129穿針引線 134細(xì)枝末節(jié) 135建議獲取任務(wù) 137快速閱讀指南 139xii 目 錄第12章使用GooglePlay服務(wù) 140工作原理 140使用位置服務(wù) 14112.2.1起步 142創(chuàng)建用戶界面 143連接到位置提供器 146獲取更新 148處理錯(cuò)誤 148請(qǐng)求權(quán)限 150
13.3.1使用SQLiteOpenHelper...13.3.2定義主程序 添加記錄 158運(yùn)行查詢 159顯示查詢結(jié)果 160數(shù)據(jù)綁定 161使用內(nèi)容提供器 164修改主程序 165添加記錄 16612.2.7
運(yùn)行
151
運(yùn)行查詢 166實(shí)現(xiàn)內(nèi)容提供器 16612.3快速閱讀指南 151第13章使用SQL 152SQLite簡(jiǎn)介 152SQL基礎(chǔ)知識(shí) 153DDL語句 153修改語句 154查詢語句 154一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)程序 154
使用加載器 168快速閱讀指南 170第五部分 附錄附錄Java和Android在語言和API方面的異同 172第一部分2 2 第1章 快速入快速入門第1章Android是一種激動(dòng)人心的開源移動(dòng)平臺(tái),它像手機(jī)一樣無處不在,得到了Google以及其他(如三星、HTC和等)好在Android開發(fā)入門很容易,即使沒有Android手機(jī)都沒關(guān)系,只需有一臺(tái)可供安裝AndroidSDK和設(shè)備模擬器的計(jì)算機(jī)即可。本章首先介紹如何安裝所有的開發(fā)工具,然后再創(chuàng)建一個(gè)可運(yùn)行的應(yīng)用——Android版“Hello,orldAndroid安裝工具Android軟件開發(fā)包(SDK)適用于Windows、Linux和MacOSX,使用它開發(fā)的應(yīng)用可部署到任何Android設(shè)備。要進(jìn)行Android開發(fā),必須先安裝Java、IDE和AndroidSDK。Java7.0+首先,需要安裝Jv開發(fā)包(K。所有nrod開發(fā)工具都需要它,在編寫程序時(shí)將使用Java語言。要求安裝JDK7或8。注意Mac用戶可跳過這一小節(jié),因?yàn)锳ndroidStudio會(huì)自動(dòng)安裝合適的JDK版本(如果你沒有JDKOverflow網(wǎng)站?的故障排除技巧②。安裝工具 31①SE81還需設(shè)置環(huán)境變量JAVA_HOME,使其指向JDKdwsJDK安裝目錄。最后,單擊“確定”按鈕關(guān)閉所有的窗口并保存設(shè)置。要核實(shí)JDK版本是否正確無誤,可打開一個(gè)shell窗口(在Windows中,要打開shell窗口,可單擊“開始”按鈕,輸入d并按回車鍵,并執(zhí)行如下命令。后面是我執(zhí)行這些命令時(shí)得到的輸出:C:\>java-versionjavaversion"1.8.0_31"Java(TM)SERuntimeEnvironment(build1.8.0_31-b13)JavaHotSpot(TM)64-BitServerVM(build25.31-b07,mixedmode)C:\>echo%JAVA_HOME%C:\ProgramFiles\Java\jdk1.8.0_31你應(yīng)看到類似的輸出,其中的版本號(hào)為1.7或更高。AndroidStudio接下來,需要安裝Java開發(fā)環(huán)境(如果還沒有安裝的話。建議使用AndroidStudio,因?yàn)樗敲赓M(fèi)的,并得到了打造Android的Google開發(fā)人員的采用和支持。務(wù)必使用最新的betaAndroidStudio下載頁(yè)面DownloadAndroidStudio按鈕。注意如果不想使用Androidtudi(大千世界什么人都有NetBeans和Eclipse等IDE,它們都有相應(yīng)社區(qū)的支持。如果你非常老派,根本不想使用IDE,也可只使用命令行工具?。本書假設(shè)你使用的是AndroidStudio,如果不是這樣,就需要做必要的調(diào)整。1.2 創(chuàng)建第一個(gè)程序1.2 創(chuàng)建第一個(gè)程序PAGE5PAGE10第PAGE10第1章 快速入門Eclipse怎么了?Eclipse怎么了?直到最近,大部分Android開發(fā)人員使用的依然是EclipseIDE1和AndroidDevelopmentTools。2013年5月,Google推出了AndroidStudio——一款新的開發(fā)環(huán)境,它基于JetBrains開發(fā)的IntelliJIDEA2。AndroidStudioGradleAndroidStudio還提供了很WYSIWYGEclipse依然得到了支持,但大多數(shù)新開發(fā)都將在AndroidStudio中進(jìn)行。\h\h/idea下載并安裝AndroidStudio后,啟動(dòng)它,并按屏幕指示進(jìn)行操作。對(duì)于所有設(shè)置,都接受默認(rèn)的標(biāo)準(zhǔn)值,即不斷地單擊Next按鈕,并最終單擊Finish按鈕。下載并安裝所需的一切可能需要幾分鐘,最終你將看到圖1-1所示的界面。圖1-1這意味著已經(jīng)成功地安裝了AndroidStudio,可以開始開發(fā)了。別忘了,AndroidStudio在不斷地發(fā)展變化,因此你看到的界面可能會(huì)與本書所展示的稍有1不同。在新版本中,默認(rèn)文件名和目錄也可能不同。如果遇到這樣的差別,請(qǐng)相應(yīng)地調(diào)整操作,并報(bào)告到本書的在線論壇①。1真是討厭!好在你只需這樣做一次?,F(xiàn)在萬事俱備,是時(shí)候編寫第一個(gè)程序了。創(chuàng)建第一個(gè)程序AndroidStudio自帶了多個(gè)示例程序,即模板。下面使用其中一個(gè)模板來創(chuàng)建一個(gè)簡(jiǎn)單的“Hello,Android”程序。這只需幾秒鐘就能完成。請(qǐng)準(zhǔn)備秒表。準(zhǔn)備好了嗎?出發(fā)!選擇StartanewAndroidStudioproject,打開NewProject對(duì)話框。將依次出現(xiàn)4個(gè)界面。其中,第一個(gè)界面要求給出應(yīng)用的名稱和存儲(chǔ)位置,如圖1-2所示。圖1-2將應(yīng)用名設(shè)置為HelloAndroid,并將公司域名設(shè)置為,AndroidStudio會(huì)自動(dòng)填寫其他內(nèi)容。單擊Next按鈕繼續(xù)執(zhí)行。第二個(gè)界面提示指定適用的Android版本,如圖1-3所示。圖1-3選擇復(fù)選框PhoneandTablet,并將MinimumSDK指定為API16:Android4.1(JellyBean)。這一步很重要,請(qǐng)務(wù)必確保選擇了正確的版本。接下來,單擊Next按鈕。第三個(gè)界面要求選擇要添加的示例活動(dòng)的類型,如圖1-4所示。圖1-41選擇BlankActivitywithFragment,并單擊Next按鈕。1最后一個(gè)界面要求指定活動(dòng)名和其他信息,如圖1-5所示。圖1-5將活動(dòng)名(ActivityName)改為HelloActivity,其他內(nèi)容將自動(dòng)被填寫完成。在本書后面的示例中,為了節(jié)省時(shí)間,我們將采用如下簡(jiǎn)化方式指出這些新建項(xiàng)目設(shè)置。應(yīng)用名:HelloAndroid尺寸:Phoneand最低SDK:API16,Android4.1(JellyBean)添加活動(dòng):BlankActivitywithFragment活動(dòng)名:HelloActivityFinishIDE注意在顯示fragment_hello.xml的編輯器中,如果出現(xiàn)了有關(guān)渲染問題(RenderingProblems)的錯(cuò)誤消息,不用管它,只需將窗口關(guān)閉即可。這是AndroidStudio中一個(gè)已知的bug。向?qū)⒊绦蚓帉懞昧?,你需要做的只是嘗試運(yùn)行它。下面,首先在Android模擬器中運(yùn)行它。Android模擬器中運(yùn)行模擬器是一個(gè)程序,它運(yùn)行在一種硬件上,卻可以模擬另一種硬件。使用Android模擬器,幾乎可在臺(tái)式機(jī)上創(chuàng)建任何平板電腦、手機(jī)和可穿戴設(shè)備的虛擬版本。要運(yùn)行Android程序,可選擇菜單Run?Run'app',也可單擊工具欄上的Run按鈕,如圖1-6所示。圖1-6過一會(huì)兒后,將出現(xiàn)ChooseDevice對(duì)話框,如圖1-7所示。圖1-7確定選擇了Launchemulator,并指定了Android虛擬設(shè)備(AVD)的名稱。單擊OK按鈕,運(yùn)行程序。將打開Android模擬器窗口并啟動(dòng)Android操作系統(tǒng)。首次這樣做時(shí),這可能需要一兩分鐘,請(qǐng)耐心等待。如果屏幕被鎖定,請(qǐng)按說明輕掃鼠標(biāo)以解鎖。AndroidStudio將程序的副本發(fā)送給模擬器并執(zhí)行它。此時(shí)將出現(xiàn)應(yīng)用界面,這說明“Hello,Android”程序正在運(yùn)行,如圖1-8所示。1在實(shí)際設(shè)備上運(yùn)行 91圖1-8如果幾分鐘后模擬器還沒有出現(xiàn),或者看起來像停止了一樣,可能是由于你的計(jì)算機(jī)不與Intel硬件加速兼容。為解決這種問題,可新建一個(gè)ARM處理器而不是Intelx86。更詳細(xì)的信息請(qǐng)參閱8.1節(jié)。另一種解決方案是使用Genymotion模擬器①。就這么簡(jiǎn)單!祝賀你編寫了第一個(gè)Android程序。在實(shí)際設(shè)備上運(yùn)行在開發(fā)期間,要在物理設(shè)備(如Nexus5)上運(yùn)行Android程序。做法幾乎與在模擬器中運(yùn)行nod47次(這是dod開發(fā)者提供的USB在計(jì)算機(jī)上安裝AndroidUSB設(shè)備驅(qū)動(dòng)程序(如果沒有安裝的話,僅Windows系統(tǒng)需要這樣做USPAGE10第PAGE10第1章 快速入門首次安裝USB驅(qū)動(dòng)程序時(shí)可能比較棘手。UsingHardwareDevices頁(yè)面①提供了最新的設(shè)備驅(qū)USB(其中還顯示了你的計(jì)算機(jī)的Ssowomhsopu,再單擊ChooseDevicesamedeviceforfuturelaunches。如果設(shè)備沒有出現(xiàn)在列表中,通常意味著,要么USB驅(qū)動(dòng)程序有問題,要么針對(duì)的Android版本不對(duì)。應(yīng)用準(zhǔn)備就緒后,要將其發(fā)布給其他人使用。這需要執(zhí)行一些額外的步驟,將在第9章進(jìn)行詳細(xì)介紹。縮短周轉(zhuǎn)時(shí)間縮短周轉(zhuǎn)時(shí)間啟動(dòng)模擬器需要很長(zhǎng)時(shí)間。可以這樣想象一下:開啟手機(jī)時(shí),它需要像其他任何計(jì)算機(jī)系統(tǒng)一樣啟動(dòng),而關(guān)閉模擬器就像是關(guān)閉手機(jī)并取出電池一樣。因此,請(qǐng)不要關(guān)閉模擬器!在AndroidStudio運(yùn)行期間,應(yīng)始終打開模擬器窗口。這樣,下次啟動(dòng)Android程序時(shí),AndroidStudio將注意到模擬器正在運(yùn)行,因此只需要將程序發(fā)送給它去運(yùn)行即可。其他步驟為節(jié)省時(shí)間,前面省略了兩個(gè)步驟,下面來對(duì)其加以介紹。檢查更新AndroidStudio還不是很成熟,修改頻率比AndroidSDK高得多。你下載的版本可能不同于本書使用的版本,可能還會(huì)有一些獨(dú)特之處。forUpdate。添加SDK包AndroidStudio安裝程序包含AndroidSDK和基本開發(fā)工具。然而,隨著學(xué)習(xí)的不斷深入,你可能會(huì)發(fā)現(xiàn)還需要其他工具。要獲取這些工具,可運(yùn)行AndroidSDKManager。其他步驟 1在AndroidStudio中,選擇菜單Tools?Android?SDKManager。管理器將顯示一個(gè)可用組件列表,其中包括文檔、平臺(tái)、插件庫(kù)和USB驅(qū)動(dòng)程序,如圖1-9所示。1圖1-9建議安裝如下組件的最新版本。AndroidSDKArodKPafor-oo(ArdDugrg。AndroidSDKBuild-tools:編譯工具。Arod5(AI2AndroidSupportRepository:gradle需要它。AndroidSupportLibrary:用于與較舊的Android版本兼容。GooglePlayservices:增值庫(kù),包含很多不錯(cuò)的功能。GoogleRepository:gradle需要它。GgeBrv(僅noIntelx86EmulatorAccelerator:提高模擬器速度的插件包。選擇要安裝的所有組件后,單擊Install按鈕。安裝可能需要很長(zhǎng)時(shí)間才能完成。在系統(tǒng)詢問是否接受許可協(xié)議時(shí),務(wù)必接受所有的許可協(xié)議(有時(shí)有多個(gè)許可協(xié)議。出現(xiàn)有關(guān)重啟SDKManager的消息時(shí),讓系統(tǒng)重啟就是了。如果出現(xiàn)HTTPSSSL錯(cuò)誤,請(qǐng)?jiān)贏ndroidSDKManager中選擇菜單Tools?Options,再選擇復(fù)選框Forcehttps://sourcestobefetchedusinghttp://。PAGE12第PAGE12第1章 快速入門快速閱讀指南拜AndroidStudio所賜,創(chuàng)建一個(gè)Android程序骨架只需幾秒鐘。第3章將開始充實(shí)這個(gè)骨架,讓它變成一個(gè)貨真價(jià)實(shí)的應(yīng)用——一個(gè)井字游戲。本書的很多章都將使用這個(gè)示例來演示AndroidAPI。在著手編寫這個(gè)游戲之前,請(qǐng)先花幾分鐘時(shí)間閱讀第2章。掌握活動(dòng)和生命周期等基本概念后,本書余下的內(nèi)容理解起來將會(huì)容易得多。開發(fā)Android程序時(shí),并非一定要使用AndroidStudio,不過還是強(qiáng)烈建議使用它。如果你以前從未使用過IntelliJ,可能應(yīng)該花點(diǎn)時(shí)間閱讀JetBrains網(wǎng)站①的IntelliJIDEA快速入門指南。需要特別注意的是快捷鍵,因?yàn)橹灰斡泿讉€(gè)快捷鍵,就可以節(jié)省大量時(shí)間。2.1 2.1 總覽 重要概念第2章2AndroidLinux內(nèi)核和SQL數(shù)據(jù)庫(kù),你可能很熟悉,而對(duì)于其他組成部分,如Android的應(yīng)用生命周期概念,你可能是完全陌生的。2要編寫行為良好的Android應(yīng)用,必須深入了解這些重要概念。因此,如果你只想閱讀本書的某一章,那就閱讀本章吧。2.1 總覽先來看看總體系統(tǒng)架構(gòu)——Android開源軟件棧的重要分層和組件。圖2-1說明了Android的總體情況,請(qǐng)仔細(xì)研究。圖2-1Android系統(tǒng)架構(gòu)每層都使用它下面各層提供的服務(wù)。下面從最底層開始,來著重介紹Android的各層。PAGE14第PAGE14第2章 重要概念Linux內(nèi)核Android以經(jīng)過實(shí)踐檢驗(yàn)的可靠LinuxLinux是Linus于1991Linux為AndroidAndroid能夠移植到各種平臺(tái)之上。使用LinuxAndroidLinux調(diào)用。然而,作為開發(fā)人員,你必須知道Linux內(nèi)核的存在。在開發(fā)期間所使用的某些工具會(huì)與Linux進(jìn)行交互。例如,命令adbshell①用于打開一個(gè)LinuxLinux文件系統(tǒng)、查看活動(dòng)進(jìn)程等,但要受到安全限制的約束。原生庫(kù)C或C++Android設(shè)備使用的硬件架構(gòu)進(jìn)行編譯,并由廠商預(yù)裝。下面是一些最重要的原生庫(kù)。SurfacedoA、V(.6、H.263、MP3和MPEG-4。SQL數(shù)據(jù)庫(kù):Android包括一個(gè)輕量級(jí)的SQLite數(shù)據(jù)庫(kù)引擎②——Firefox和AppleiPhone使用的數(shù)據(jù)庫(kù)??梢栽趹?yīng)用中使用它來實(shí)現(xiàn)持久化存儲(chǔ)。瀏覽器引擎:為快速顯示HTML內(nèi)容,Android使用了Chromium庫(kù)?。這是GoogleChrome瀏覽器使用的引擎,與AppleSafari瀏覽器和AppleiPhone使用的引擎很像。,veDveentook總覽 15Android運(yùn)行時(shí)2JavaDalvik或具體使用哪個(gè)取決于Android版本。2v是oe的nonn(VVM執(zhí)行。ART(AndroidRuntime)是一款超前的編譯器,Android5.0(Lollipop)用它取代了Dalvik。在將應(yīng)用安裝到Android可以提高程序的運(yùn)行速度,但代價(jià)是安裝時(shí)間更長(zhǎng)。Dalvik和ART都是Google推出的準(zhǔn)兼容性Java實(shí)現(xiàn),都針對(duì)移動(dòng)設(shè)備進(jìn)行了優(yōu)化。在Android開發(fā)中,所有代碼都使用Java編寫,并由Dalvik或ART運(yùn)行。請(qǐng)注意,Android自帶的核心Java庫(kù)不同于JavaStandardEdition(JavaSE)庫(kù)和JavaMobileEdition(JavaME)庫(kù),但它們有很多相同的地方。附錄對(duì)AndroidJava庫(kù)和標(biāo)準(zhǔn)Java庫(kù)做了比較。應(yīng)用框架在原生庫(kù)和運(yùn)行時(shí)之上,是應(yīng)用框架層。它提供了用于創(chuàng)建應(yīng)用的高級(jí)構(gòu)件。這個(gè)框架是隨Android預(yù)安裝的,你可以根據(jù)需要對(duì)其進(jìn)行擴(kuò)展,在其中添加自己的組件。擁抱并擴(kuò)展擁抱并擴(kuò)展 AndroidAPIAndroid用你的應(yīng)用替換標(biāo)準(zhǔn)應(yīng)用。下面是應(yīng)用框架最重要的組成部分。(參見2.3節(jié)2.2.6節(jié)。資源管理器:資源指的是程序中除代碼之外的其他所有東西,詳情請(qǐng)參閱2.2.7節(jié)。位置管理器:Android設(shè)備始終知道其身處何方,詳情請(qǐng)參閱第12章。通知管理器:以不唐突的方式將短信、約會(huì)、接近提示、外族入侵等事件告知用戶。2.2 構(gòu)件2.2 構(gòu)件PAGE17PAGE16第PAGE16第2章 重要概念應(yīng)用和服務(wù)Android冰山露出水面的部分。應(yīng)用是可以占據(jù)整個(gè)屏幕并與用戶進(jìn)行交互的程序,而服務(wù)則隱匿在用戶的視線之外,默默地?cái)U(kuò)展應(yīng)用框架。本書主要介紹應(yīng)用的開發(fā),因?yàn)槲覀兯帉懙拇蠖喽际菓?yīng)用。Android手機(jī)和平板電腦在出廠時(shí)自帶了很多標(biāo)準(zhǔn)系統(tǒng)應(yīng)用,其中包括:電話撥號(hào)程序電子郵件相機(jī)瀏覽器GooglePlay商店使用GooglePlayAndroid應(yīng)用框架提供了大量可用于創(chuàng)建應(yīng)用的構(gòu)件,下面就來對(duì)其進(jìn)行介紹。構(gòu)件在AndroidSDK活動(dòng)3.2.1Context片段片段是活動(dòng)的一個(gè)組成部分,通常顯示在屏幕上,但并非必須如此。片段是Android3.0(Honeycomb)引入的,如需針對(duì)較舊的Android版本時(shí),可使用兼容庫(kù)。22圖2-2視圖XML意圖意圖是一種行為(如選擇照片、給家里打電話、打開艙門)描述機(jī)制。在Android中,幾乎服務(wù)服務(wù)是在后臺(tái)運(yùn)行的任務(wù),無需用戶與之直接進(jìn)行交互,類似于Linux守護(hù)程序。就拿音樂Android自帶了很多內(nèi)置服務(wù),還有能夠方便訪問這些服務(wù)的API。Google還提供了支持額外功能的可選服務(wù),詳情請(qǐng)參閱第12章。內(nèi)容提供器內(nèi)容提供器是一組數(shù)據(jù)和用于讀取它們的自定義API(使用資源Android資源編輯器(aapt)①根據(jù)資源文件所屬的JPGres/drawable資源編譯器對(duì)資源進(jìn)行壓縮和打包,再生成一個(gè)名為RJava下面來更詳細(xì)地介紹Android應(yīng)用的生命周期,它與桌面應(yīng)用程序的生命周期稍有不同。前臺(tái)只能有一個(gè)應(yīng)用在標(biāo)準(zhǔn)Linux或Windows臺(tái)式機(jī)中,可以有很多應(yīng)用程序同時(shí)運(yùn)行,它們可以同時(shí)出現(xiàn)在不松地在應(yīng)用程序之間進(jìn)行切換并移動(dòng)窗口(以便能夠看到當(dāng)前執(zhí)行的操作序關(guān)閉。Android的工作原理則不同。在Android中只有一個(gè)前臺(tái)應(yīng)用,它通常占據(jù)除狀態(tài)欄以外的整個(gè)屏幕。用戶開啟手機(jī)或平板電腦時(shí),看到的第一個(gè)應(yīng)用為主屏幕,如圖2-3所示。2.3 前臺(tái)只能有一個(gè)應(yīng)用2.3 前臺(tái)只能有一個(gè)應(yīng)用PAGE19PAGE20第PAGE20第2章 重要概念22圖2-3用戶運(yùn)行應(yīng)用時(shí),Android會(huì)啟動(dòng)該應(yīng)用并讓它進(jìn)入前臺(tái)。在運(yùn)行該應(yīng)用時(shí),用戶可能還會(huì)不斷調(diào)用其他應(yīng)用或當(dāng)前應(yīng)用中的其他屏幕。系統(tǒng)的活動(dòng)管理器會(huì)將所有這些程序和屏幕都記錄到應(yīng)用棧中。每當(dāng)用戶按“返回”按鈕時(shí),都將返回到棧中的前一個(gè)屏幕。從用戶的角度來看,這很像Web瀏覽器的歷史記錄,按“后退”按鈕將返回到前一個(gè)頁(yè)面。進(jìn)程不等于應(yīng)用在內(nèi)部,每個(gè)用戶界面屏幕都由一個(gè)活動(dòng)表示(參見2.2.1節(jié)應(yīng)用由一個(gè)或多個(gè)活動(dòng)以及包含這些活動(dòng)的Linux進(jìn)程組成。這聽起來相當(dāng)簡(jiǎn)單,不是嗎?但別高興得太早,難懂的地方就在后面。在Android中,應(yīng)用在其進(jìn)程終止后也能存活。換句話說,活動(dòng)的生命周期并不受制于進(jìn)程的生命周期。進(jìn)程并不是一次性的活動(dòng)容器。活動(dòng)的生命周期在生命周期內(nèi),Android程序的活動(dòng)可處于多種狀態(tài),如圖2-4所示。開發(fā)人員并不能控制onXX()來通知你。圖2-4在創(chuàng)建的Activity子類時(shí),需要重寫如下方法,Android會(huì)在合適的時(shí)候調(diào)用它們。創(chuàng)建用戶界面。onCreate接受一個(gè)參數(shù),這個(gè)參數(shù)要么為null,要么為方法onSaveInstanceState()保存的狀態(tài)信息。onStart():表明活動(dòng)即將顯示給用戶。onResume():活動(dòng)能夠開始與用戶交互時(shí)被調(diào)用。這是啟動(dòng)動(dòng)畫和音樂的理想場(chǎng)所。通常是由于啟動(dòng)了另一個(gè)活動(dòng)onStop():在活動(dòng)對(duì)用戶不再可見且暫時(shí)不需要該活動(dòng)時(shí)被調(diào)用。如果內(nèi)存緊張,onStop()可能不會(huì)被調(diào)用(系統(tǒng)可能會(huì)直接終止進(jìn)程。onRestart():如果該方法被調(diào)用,就表明原本處于停止?fàn)顟B(tài)的活動(dòng)重新顯示到了屏幕上。(系統(tǒng)可能會(huì)直接終止進(jìn)程。onSaveInstanceState(Bundle):Android調(diào)用這個(gè)方法讓活動(dòng)保存其特有的狀態(tài),如光標(biāo)在文本框中的位置。通常不需要重寫這個(gè)方法,因?yàn)槟J(rèn)實(shí)現(xiàn)會(huì)自動(dòng)保存所有用戶界面控件的狀態(tài)。onSaveInstanceState()方法保存的狀態(tài)重新初始化活動(dòng)時(shí)被調(diào)用,其默認(rèn)實(shí)現(xiàn)會(huì)恢復(fù)用戶界面的狀態(tài)。2不在前臺(tái)運(yùn)行的活動(dòng)可能會(huì)被停止。另外,包含此類活動(dòng)的Linux進(jìn)程也可能隨時(shí)被終止,以便為新活動(dòng)騰出空間。這種情況屢見不鮮。因此在設(shè)計(jì)應(yīng)用時(shí),一開始就必須考慮到這一點(diǎn)。這很重要。在某些情況下,onPause()可能是最后一個(gè)被調(diào)用的活動(dòng)方法,因此對(duì)于要保留到下次使用的任何數(shù)據(jù),都必須在這里進(jìn)行保存。2從Android3.0(Honeycomb)起,Google在應(yīng)用生命周期的故事中引入了另一個(gè)情節(jié)——片段。使用片段簡(jiǎn)化工作片段是應(yīng)用的組成部分,它們包含在活動(dòng)中(參見22節(jié)上,片段的很多生命周期方法都是由活動(dòng)的方法調(diào)用的(例如,F(xiàn)ragment.onResume()間接地由Activity.onResume()調(diào)用。詳情請(qǐng)參閱圖2-5。圖2-5安全保障前面說過,每個(gè)應(yīng)用都運(yùn)行在自己的Linux進(jìn)程中。硬件禁止一個(gè)進(jìn)程去訪問另一個(gè)進(jìn)程的ID。只要設(shè)備沒有被root(以更高的權(quán)限運(yùn)行應(yīng)用AndroidManifest.xml中INTERNET:訪問Internet。READ_CONTACTS:讀取但不寫入用戶的聯(lián)系人數(shù)據(jù)。WRITE_CONTACTS:寫入但不讀取用戶的聯(lián)系人數(shù)據(jù)。RECEIVE_SMS:監(jiān)視收到的短信。ACCESS_COARSE_LOCATION:使用粗糙的位置提供器,如基站或。GPS。例如,要監(jiān)視收到的短信,需要在清單文件中包含如下內(nèi)容:<manifestxmlns:android="\h/apk/res/android"package="com.google.android.app.myapp"><uses-permissionandroid:name="android.permission.RECEIVE_SMS"/></manifest>Android甚至可以限制訪問系統(tǒng)的特定部分。通過在AndroidManifest.xml中使用XML標(biāo)簽,Android安全模型的在線幫助①??焖匍喿x指南本書余下的篇幅將使用本章介紹的所有概念。第3章將使用活動(dòng)和生命周期方法來定義一個(gè)示例應(yīng)用,第6章將探索多媒體編碼解碼器,而第13章將介紹內(nèi)容提供器。第二部分開發(fā)一個(gè)游戲24 24 第3章 開局走開局走法第3章在第1章,我們使用AndroidStudio編寫了一個(gè)簡(jiǎn)單的“Hello,Android”程序。這在幾分鐘內(nèi)就完成了,但功能有限。在第二部分,我們將創(chuàng)建一個(gè)有趣得多的應(yīng)用——終極版井字游戲(aeo。通過不斷給這個(gè)程序添加功能,你將學(xué)習(xí)Android編程的很多方面。這些知識(shí)將有助于你編寫自己的程序——游戲、商業(yè)應(yīng)用以及你能想象得到的任何程序。我們將從用戶界面著手。在本書中,每個(gè)示例都被完整地呈現(xiàn)了出來,以便能夠讓你在閱讀的同時(shí)在AndroidStudio中跟著做。你可以從本書配套網(wǎng)站①下載這些示例,這樣可以節(jié)省大量的代碼輸入時(shí)間。如果你閱讀的是電子版,那么可以單擊代碼清單前面的文件名,直接下載該文件。創(chuàng)建井字游戲示例人人都會(huì)玩井字游戲:一個(gè)3×3的棋盤,最初是空的,兩個(gè)玩家輪流在空格中填寫X或O,先將自己的3個(gè)棋子連成線者獲勝。如果棋盤填滿后還沒人將3個(gè)棋子連成線,就視為平局。終極版井字游戲②與此類似,只不過每格都內(nèi)嵌了一個(gè)井字,玩家不是通過下子來占據(jù)各個(gè)格子,而是需要玩贏格子內(nèi)的井字游戲才能占據(jù)它,如圖3-1所示。no和O(c”③)為了新建一個(gè)程序,選擇菜單File?NewProject并輸入如下信息。3.2 3.2 XML進(jìn)行設(shè)計(jì)PAGE25PAGE26第PAGE26第3章 開局走法尺寸:Phoneand最低SDK:API16:Android4.1(JellyBean)添加活動(dòng):BlankActivity33標(biāo)題:UT3圖3-1井字游戲遇上《盜夢(mèng)空間》可將目錄res/menu刪除,因?yàn)檫@個(gè)項(xiàng)目不需要它。在編寫這個(gè)程序的實(shí)際代碼前,需要設(shè)計(jì)起始屏幕。為此,我們將編輯一個(gè)XML布局文件。XML進(jìn)行設(shè)計(jì)在Android中,定義用戶界面的方式有兩種:使用代碼和使用XML。通常推薦使用XML,因?yàn)橄啾扔贘ava代碼,使用XML來創(chuàng)建界面以及設(shè)置界面樣式會(huì)更容易。AndroidStudio包含一個(gè)可視化布局編輯器,讓你能夠使用鼠標(biāo)將按鈕和列表等控件拖放到創(chuàng)建主屏幕圖3-2activity_main.xmlAndroidStudio(Project)中的文件名activity_main.xml3、Packages和Android。要切換模式,可使用窗口名旁邊的下拉列表。如果沒有看到XML,請(qǐng)單擊編輯器窗口底部的Text標(biāo)簽。將文本修改成如下內(nèi)容。ticTacToev1/src/main/res/layout/activity_main.xml <FrameLayoutxmlns:android="\h/apk/res/android"xmlns:tools="\h/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="false"tools:context=".TicTacToeActivity"><fragmentandroid:id="@+id/main_fragment"class="org.example.tictactoe.MainFragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"tools:layout="@layout/fragment_main"/></FrameLayout>(該片段為類MainFragment的實(shí)例。如果要讓代碼正確地對(duì)齊,可選擇菜單Code?ReformatCode,也可dw。如果你是手動(dòng)將這些代碼輸入到AndroidStudio中的,將發(fā)現(xiàn)有些文本是紅色的,且預(yù)覽窗口中顯示了錯(cuò)誤消息(如果打開了該窗口它們。3FrameLayout:以堆疊方式顯示一個(gè)或多個(gè)子視圖。3GridLayout:將子視圖按行和列排列。LinearLayout:將所有子視圖排列成一行或一列。RelativeLayout:一種靈活的布局,以相對(duì)于其他視圖的方式排列視圖。有關(guān)Android布局的完整列表,以及對(duì)每種布局可設(shè)置的選項(xiàng)的詳情,請(qǐng)參閱在線文檔①。FrameLayout最簡(jiǎn)單且效率最高,因此我們選擇使用這種布局。FrameLayout標(biāo)簽的屬性每個(gè)XML標(biāo)簽都有控制器功能的屬性,下面更深入地介紹前面給FrameLayout標(biāo)簽設(shè)置的屬性。xmlns:android="\h/apk/res/android":定義命名空間②android,以便能夠在后面使用包含android:的屬性名。xmlns:tools="\h/tools":定義命名空間tools。android:layout_width="match_parent":將視圖設(shè)置為與父視圖等寬。由于是頂級(jí)元素,這意味著它將與屏幕等寬。該屬性可設(shè)置為match_parent、wrap_content或絕對(duì)寬度值。(屏幕tools:context=".TicTacToeActivity":指出該布局文件是供TicTacToeActivity類fragment標(biāo)簽的屬性下面是前面為fragment標(biāo)簽設(shè)置的所有屬性的含義。class="org.example.tictactoe.MainFragment":讓Android知道這個(gè)片段是MainFragment類的一個(gè)實(shí)例。換句話說,Android在根據(jù)XML創(chuàng)建該片段時(shí),將創(chuàng)建一個(gè)MainFragment實(shí)例。這個(gè)類將在3.3.2節(jié)定義。android:layout_width="wrap_content":將片段設(shè)置為與其包含的內(nèi)容等寬。android:layout_height="wrap_content":將片段設(shè)置為與其包含的內(nèi)容等高。值包括top、bottom、left、right、center和fill等??蓪⒃搶傩栽O(shè)置為多個(gè)用豎線連接的值,如top|right。tools:layout="@layout/fragment_main":引用另一個(gè)XML文件,該XML文件定義了片段的內(nèi)容。創(chuàng)建主片段主片段包含3個(gè)按鈕,分別用于繼續(xù)游戲、開始新游戲以及顯示有關(guān)游戲的信息。我們將在fragment_main.xml中定義它們。復(fù)制和粘貼。。將fragment_main.xml的內(nèi)容替換為如下文本。ticTacToev1/src/main/res/layout/fragment_main.xml <LinearLayoutxmlns:android="\h/apk/res/android"xmlns:tools="\h/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/menu_background"android:elevation="@dimen/elevation_high"android:orientation="vertical"android:padding="@dimen/menu_padding"tools:context=".TicTacToeActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="@dimen/menu_space"android:text="@string/long_app_name"android:textAppearance="?android:textAppearanceLarge"android:textSize="@dimen/menu_text_size"/><Buttonandroid:id="@+id/continue_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="@dimen/menu_button_margin"android:padding="@dimen/menu_button_padding"android:text="@string/continue_label"/><Button3android:id="@+id/new_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="@dimen/menu_button_margin"android:padding="@dimen/menu_button_padding"android:text="@string/new_game_label"/>3<Buttonandroid:id="@+id/about_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="@dimen/menu_button_margin"android:padding="@dimen/menu_button_padding"android:text="@string/about_label"/></LinearLayout>其中很多行都顯示為紅色。不用擔(dān)心,本章后面將修復(fù)這些問題。在這里,要將4個(gè)元素排成一列,因此使用了一個(gè)LinearLayout,并將其android:ori-entation屬性設(shè)置為vertical。在這個(gè)線性布局內(nèi)部,定義了一個(gè)文本視圖和3個(gè)按鈕。在Android開發(fā)中,文本視圖可能是最常見的用戶界面元素了。下面列出了其他一些常見的界面元素。Button:按鈕控件。CheckBox:有兩種可能狀態(tài)的按鈕,用于多選列表中。ImageButton:顯示圖像而不是文本的按鈕。RadioButton:有兩種可能狀態(tài)的按鈕,用于單選列表中。要獲悉完整的用戶界面元素列表,請(qǐng)參閱有關(guān)View類的文檔①。LinearLayout標(biāo)簽的屬性在前面為L(zhǎng)inearLayout標(biāo)簽設(shè)置的屬性中,尚未介紹的屬性如下。。drawable可以是顏色、圖形或XML文件定義的復(fù)合對(duì)象,稍后將對(duì)其進(jìn)行更詳細(xì)的介紹。android:elevation="@dimen/elevation_high":令視圖比畫布稍高。在Android5.0(Lollipop)和更高版本中,這將導(dǎo)致在視圖下方繪制陰影。如果運(yùn)行程序的設(shè)備使用的Android版本較舊,就像其他無法識(shí)別的屬性一樣,忽略該屬性。這里沒有使用數(shù)字來明確指定視圖要比畫布高多少,而是引用了一個(gè)將在另一個(gè)XML文件中定義的尺寸。android:orientation="vertical"將子將子視圖排成一行。如果要將子視圖排成多行、多列,必須使用其他布局,如GridLayout。Android在視圖內(nèi)部留出少量的空間。如果要在視圖外部留出空間,可使用屬性margin。(如AndroidStudioTextView標(biāo)簽的屬性前面為TextView標(biāo)簽設(shè)置了如下屬性。android:text="@string/long_app_name"strings.xml中定義的long_app_name。android:textSize="@dimen/menu_text_size":即便設(shè)置了屬性textAppearance,文本看起來還不夠大,因此這里用硬編碼的方式指定了更大的字號(hào)。Button標(biāo)簽的屬性為Button標(biāo)簽設(shè)置如下屬性。android:padding="@dimen/menu_button_padding":在按鈕內(nèi)部留出一些額外的空間。android:text="@string/continue_label":指定按鈕顯示的文本。這里再次引用了將在文件strings.xml中定義的值。對(duì)于前面所有以@打頭的值,都將在3.5節(jié)中定義。下面先來編寫與XML協(xié)同工作的Java代碼。編寫代碼 31編寫代碼定義主屏幕和片段的布局后,需要編寫一些Java代碼讓它們顯示出來。先從該應(yīng)用的主活動(dòng)——MainActivity類開始。3定義主活動(dòng)3在org.example.tictactoe包中,文件夾java下應(yīng)該有一個(gè)名為MainActivity.java的文件,它是在我們創(chuàng)建項(xiàng)目時(shí)由AndroidStudio創(chuàng)建的?,F(xiàn)在,請(qǐng)打開它。為此,可在項(xiàng)目窗口中雙擊它;也vga?(在dw中ticTacToev1/src/main/java/org/example/tictactoe/MainActivity.java Line1packageorg.example.tictactoe;-importandroid.app.Activity;importandroid.os.Bundle;5publicclassMainActivityextendsActivity{-@OverrideprotectedvoidonCreate(BundlesavedInstanceState){10 super.onCreate(savedInstanceState);- setContentView(R.layout.activity_main);- }-}這是本書第一次介紹Java代碼,因此將逐行介紹每行代碼的功能。第1行定義了包名。為方便訪問以及避免名稱沖突,將Java源文件收集到了包中。包名必須與目錄名匹配。第3行和第4行告訴編譯器,我們將使用android.app包中的Activity類以及android.os包中的Bundle類。這兩個(gè)包都是Android框架提供的標(biāo)準(zhǔn)包。從第6行開始,是MainActivity類的定義,它是Activity類的子類。關(guān)于活動(dòng),已經(jīng)在第2章中討論過。從第9行開始是方法onCreate(),它是活動(dòng)生命周期的一部分,在活動(dòng)創(chuàng)建時(shí)被調(diào)用。@Override指出這個(gè)方法最初是在Activity類中定義的,但我們將給它提供新的定義。在新定義中,首先會(huì)調(diào)用舊定義,如第10行所示。第11行很重要,它使用activity_main.xml定義的XML布局填充活動(dòng)的內(nèi)容,用來演示如何使用前面聲明的XML。PAGE32第PAGE32第3章 開局走法下面來定義主活動(dòng)使用的片段。定義主活動(dòng)使用的片段在3.2.1節(jié)中,我們使用org.example.tictactoe.MainFragment類創(chuàng)建了一個(gè)片段。下面來定義這個(gè)類。ticTacToev1/src/main/java/org/example/tictactoe/MainFragment.java packageorg.example.tictactoe;importandroid.app.AlertDialog;importandroid.app.Fragment;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;publicclassMainFragmentextendsFragment{privateAlertDialogmDialog;@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){ViewrootView=inflater.inflate(R.layout.fragment_main,container,false);//在這里添加處理按鈕的代碼……returnrootView;}}這個(gè)類的結(jié)構(gòu)與MainActivityonCreateView()、一個(gè)指向父容器的引用以及一些保存的狀態(tài)。我們不需要保存的狀態(tài),而只調(diào)用方法inflater.inflate(,并傳入ytrnm(rgen_an.xl添加About框 33About框33-3所示。3圖3-3rootView的代碼前面,添加如下代碼。ticTacToev1/src/main/java/org/example/tictactoe/MainFragment.java Line1//處理按鈕的代碼……-ViewaboutButton=rootView.findViewById(R.id.about_button);aboutButton.setOnClickListener(newView.OnClickListener(){@Override5 publicvoidonClick(Viewview){AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());builder.setTitle(R.string.about_title);builder.setMessage(R.string.about_text);10 builder.setCancelable(false);builder.setPositiveButton(R.string.ok_label,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialogInterface,15 inti){//這個(gè)方法為空- }- });mDialog=builder.show();20 }-});3.5 定義資源3.5 定義資源PAGE35PAGE34第PAGE34第3章 開局走法第2行負(fù)責(zé)獲取片段視圖中的About按鈕,然后由第3鈕時(shí),將調(diào)用監(jiān)聽器的方法onClick()(第5行。第6行用于創(chuàng)建一個(gè)新的AlertDialog.Builder實(shí)例,并將當(dāng)前活動(dòng)作為參數(shù)傳入。接下來,從第8行開始,設(shè)置對(duì)話框的標(biāo)題和消息內(nèi)容。第10行調(diào)用了setCancelable(),使得Android不會(huì)在用戶輕按對(duì)話框外面時(shí)關(guān)閉它。第11行在對(duì)話框中添加了一個(gè)OK按鈕,但它沒有任何用途。定義完對(duì)話框后,第19行負(fù)責(zé)將其顯示出來。還有一項(xiàng)工作要做。我們要在包含該片段的活動(dòng)暫停(如啟動(dòng)了另一個(gè)應(yīng)用)時(shí),將About框關(guān)閉。為此,應(yīng)在MainFragment類中添加如下onPause()方法。ticTacToev1/src/main/java/org/example/tictactoe/MainFragment.java @OverridepublicvoidonPause(){super.onPause();//如果About對(duì)話框未關(guān)閉,就將其關(guān)閉if(mDialog!=null)mDialog.dismiss();}至此,MainFragment包含了兩個(gè)方法:onCreateView()和onPause()。如果編譯器報(bào)錯(cuò),請(qǐng)確保所有的大括號(hào)都匹配。如果依然有問題,請(qǐng)從本書配套網(wǎng)站①下載完整的源代碼文件。定義資源(參見2.2.7節(jié)。在編譯階段,對(duì)XML進(jìn)行了預(yù)編譯。這樣,程序在運(yùn)行時(shí)不會(huì)因?yàn)榉治鯴ML而降低性能。字符串strings.xml中,當(dāng)前所使用的字符串如下:ticTacToev1/src/main/res/values/strings.xml <?xmlversion="1.0"encoding="utf-8"?><resources><stringname="app_name">UT3</string><stringname="long_app_name">UltimateTicTacToe</string><stringname="action_settings">Settings</string><stringname="continue_label">Continue</string><stringname="new_game_label">NewGame</string><stringname="about_label">About</string><stringname="ok_label">OK</string><stringname="about_title">AboutUltimateTicTacToe</string><stringname="about_text">\ThisgameisplayedjustlikeregularTicTacToewithonedifference:to3winatileyouhavetowinasmallergameofTicTacToeinsidethattile.\n\3\n\Atiehappenswhentherearenofurthermoves.Inthecaseofatieinasmallboard,thatwillcountasawinforbothsidesinthelargergame.</string></resources>每項(xiàng)資源都有名稱和值。在Java代碼或XML中,將名稱用作id來引用資源。例如,在Java代為資源app_name的id(如vyeiX在8.3.1節(jié),將介紹如何指定替代資源。尺寸尺寸資源可用于任何需要指定長(zhǎng)度的地方。所有尺寸資源都放在一個(gè)尺寸文件(文件夾res/values下的文件dimens.xml)中,這樣有助于在不修改代碼的情況下支持不同尺寸的Android設(shè)備。到目前為止,我們的應(yīng)用使用了如下尺寸。ticTacToev1/src/main/res/values/dimens.xml <resources><dimenname="elevation_high">8dp</dimen><dimenname="stroke_width">1dp</dimen><dimenname="corner_radius">4dp</dimen><dimenname="menu_padding">10dp</dimen><dimenname="menu_space">10dp</dimen><dimenname="menu_text_size">32sp</dimen><dimenname="menu_button_margin">4dp</dimen><dimenname="menu_button_padding">10dp</dimen></resources>有關(guān)dp和sp的含義,請(qǐng)參閱3.5.6節(jié)。你可能會(huì)看到兩個(gè)版本的dimens.xml文件:常規(guī)版本和使用w820dp標(biāo)記的版本。目前只使用了常規(guī)版本,另一個(gè)版本用于寬屏設(shè)備的替代資源。有關(guān)替代資源,將在8.3.1節(jié)討論。drawabledrawable指的是可在屏幕上繪制的任何圖形對(duì)象。位圖是最簡(jiǎn)單的drawable,通常以PNG或JPG格式存儲(chǔ)。在主屏幕上,應(yīng)用的啟動(dòng)圖標(biāo)就是位圖。還可以使用XML來創(chuàng)建drawable。下面是用作主屏幕中選項(xiàng)的背景drawable的定義,它被放置在文件夾res/drawable中。ticTacToev1/src/main/res/drawable/menu_background.xml <?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="\h/apk/res/android"android:shape="rectangle"><strokeandroid:width="@dimen/stroke_width"android:color="@color/border_color"/><solidandroid:color="@color/field_color"/><cornersandroid:radius="@dimen/corner_radius"/></shape>該XML文件定義了一個(gè)矩形形狀,該形狀帶圓角并使用純色填充。注意到它引用了其他資源,以指定描邊的寬度和顏色、填充色以及圓角半徑。這也可以使用位圖來實(shí)現(xiàn),但使用XML具有如下優(yōu)點(diǎn):圖形是基于矢量的,支持任意分辨率。這意味著不管將該背景放大到多大,它都是清晰的,不會(huì)導(dǎo)致像素化。下面是最常見的drawable類型。位圖文件:PNG、JPG或GIF格式的圖片。PNG位圖可以是半透明的。九宮格(Nine-patch)文件:包含可拉伸區(qū)域的PNG圖片,支持根據(jù)內(nèi)容調(diào)整大小。圖層列表(Layerlist):一系列按順序繪制的drawable。狀態(tài)列表(Statelist):一系列drawable,根據(jù)狀態(tài)顯示不同的drawable。等級(jí)列表(Levellist):一系列drawable,根據(jù)等級(jí)值顯示不同的drawable。形狀:由線條和顏色組成的幾何形狀。有關(guān)drawable類型及其屬性的完整列表,請(qǐng)參閱在線文檔①。顏色下面是前面的背景資源使用的顏色的定義。ticTacToev1/src/main/res/values/colors.xml <?xmlversion="1.0"encoding="utf-8"?><resources><colorname="field_color">#b5cee0</color><colorname="border_color">#7f7f7f</color></resources>或#AARRGGBBGGBB分別AA為alpha組分。這些十六進(jìn)制數(shù)字的取值范圍為()~F(50#FFFF3alpha組分是可選的,表示顏色的透明度,取值范圍為0(完全透明)~255(完全不透明如果沒有設(shè)置alpha組分,顏色將是完全不透明的。3樣式和主題樣式和主題在決定應(yīng)用的外觀方面扮演著重要角色。主題是一系列樣式,而樣式是一系列控制外觀和行為的值。如果你打開文件AndroidManifest.xml,將看到下面一行。android:theme="@style/AppTheme"它引用了styles.xml中所定義的樣式AppTheme。請(qǐng)按住Ctrl鍵并單擊AppTheme以打開文件styles.xml,然后將該文件做如下修改。ticTacToev1/src/main/res/values/styles.xml <?xmlversion="1.0"encoding="utf-8"?><resources><!--應(yīng)用的基本主題--><stylename="AppTheme"parent="android:Theme.Holo.Light.NoActionBar.Fullscreen"><!--在這里定制主題--></style></resources>AndroidStudio編輯器中將光標(biāo)放在android:Theme.dp和sp以前,程序員設(shè)計(jì)計(jì)算機(jī)界面時(shí)總是以像素為單位。例如,可能將文本框的寬度設(shè)置為16×16(dpi)越多,界面越小。dpi高到一定程度后,將很難看清界面。為幫助解決這種問題,可使用獨(dú)立于分辨率的度量單位。Android支持如下度量單位。p((英寸(毫米p(磅:1英寸。d(0dp1dp=1p。dip:含義與dp相同。(為了讓界面能夠適應(yīng)當(dāng)前和未來的屏幕類型,建議在指定文本大小時(shí)以sp為單位,而指定其他內(nèi)容的大小時(shí)都以dp為單位。在任何時(shí)候,都不要以像素(px)為單位。運(yùn)行游戲萬事俱備,現(xiàn)在可以運(yùn)行這個(gè)游戲了。為此,可選擇菜單Run?Run'app'、單擊工具欄上的u(nwho,do如果一切順利,你將看到類似于圖3-2所示的屏幕。如果你點(diǎn)擊按鈕Continue或NewGame,什么都不會(huì)發(fā)生(這些功能將在下一章添加;而如果你點(diǎn)擊ou按鈕,將出現(xiàn)Au對(duì)話框,請(qǐng)點(diǎn)擊OK按鈕將其關(guān)閉。小喬愛問:小喬愛問:如何退出呢?這是因?yàn)楦揪筒恍枰@種按鈕如果添加Android1。要退出游戲,只需按返回按鈕或主屏幕按鈕,也可按近期使用的應(yīng)用(RecentApps)按鈕,并從列表中選擇其他應(yīng)用。你可能擔(dān)心這會(huì)讓程序繼續(xù)運(yùn)行。根本沒必要。在其他程序需要資源時(shí),Android將終(Recent在開發(fā)階bug要這樣做。1.\h/design調(diào)試調(diào)試 39器中以步進(jìn)方式執(zhí)行程序。使用日志消息進(jìn)行調(diào)試Log類提供了多個(gè)靜態(tài)方法,可用于將各種等級(jí)的消息打印到Android系統(tǒng)日志。33v:詳情(o。Log.wtf():致命錯(cuò)誤。用戶永遠(yuǎn)都看不到系統(tǒng)日志,但開發(fā)人員可以兩種方式查看它。在AndroidStudio中,程序運(yùn)行時(shí),LogCat視圖將出現(xiàn)在窗口底部,如圖3-4所示。為減少顯示的內(nèi)容,可將日志等級(jí)設(shè)置為除Verbose外的其他值,也可在篩選文本框中輸入一個(gè)字符串。圖3-4請(qǐng)?jiān)诔绦蛑休斎腩愃迫缦碌拇a行。Log.d("UT3","GottopointA");這樣,下次運(yùn)行程序時(shí)將在日志中看到它們。如果你使用的不是AndroidStudio,可采用如下方法查看這種輸出:切換到SDK安裝目錄下platform-tools,并運(yùn)行命令adblogcat①在開發(fā)期間,要特別強(qiáng)調(diào)Android日志的重要性。每當(dāng)遇到意外的錯(cuò)誤時(shí),都請(qǐng)先查看日志。十有八九你都可以通過它獲得足夠的信息,進(jìn)而將問題排除,而無需使用重武器——調(diào)試器。PAGE40第PAGE40第3章 開局走法使用調(diào)試器進(jìn)行調(diào)試AndroidStudio提供了一個(gè)調(diào)試器,它是排除Android程序中的問題的終極方式。要啟動(dòng)調(diào)試?D(而不是?nw中為h。Javagutter,單擊處將出現(xiàn)一個(gè)紅色圖標(biāo)。下次程序運(yùn)行到相應(yīng)代碼行時(shí)將暫停執(zhí)行。暫停執(zhí)行后,屏幕底部將出現(xiàn)調(diào)試窗口,如圖3-5所示。其中顯示了當(dāng)前位置以及所有變量的值。圖3-5在這個(gè)窗口中,你可以檢查變量和類成員、查看到達(dá)當(dāng)前位置的調(diào)用序列(追蹤下執(zhí)行到下一個(gè)斷點(diǎn)或以每次一行的方式執(zhí)行程序。測(cè)試單元測(cè)試JUnit框架Studio和gradle都為單元測(cè)試提供了支持??焖匍喿x指南 4133.7 快速閱讀指南3本章介紹的內(nèi)容很多。你白手起家,使用了布局文件來組織用戶界面,并使用Android資源來提供文本、顏色等。你還創(chuàng)建了表示活動(dòng)和片段的Java類,并添加了按鈕和文本框等控件。Android是個(gè)復(fù)雜的系統(tǒng),但無需全面了解它就可開始編程。需要幫助時(shí),可參閱數(shù)百頁(yè)在線參考資料,它們更深入地介紹了所有的類和方法。要查看在線文檔,可打開AndroidSDK安裝目錄下的子目錄docs,也可以通過瀏覽器訪問\h。當(dāng)然,每當(dāng)你遇到困難時(shí),都可以訪問本書配套的在線論壇②。其他讀者和作者將很樂意幫你擺脫困境。另一個(gè)不錯(cuò)的資源是StackOverflow③,也可以使用Google進(jìn)行搜索。信不信由你,即便在Google和網(wǎng)絡(luò)面世前,人們也能編寫程序。但現(xiàn)在如果沒有網(wǎng)絡(luò),做什么事情都難上加難。這也是提倡購(gòu)買大量圖書的另一個(gè)原因!42 42 第4章 定義游戲界定義游戲界面第4章棋盤從小處著手X和(所示圖4-1你可以自己制作這些符號(hào),也可以從本書配套網(wǎng)站①下載(它們位于示例代碼ticTacToev2中Inkscape②創(chuàng)建了x_blue.png和(1284.1 棋盤4.1 棋盤PAGE43PAGE44第PAGE44第4章 定義游戲界面像素×128像素)的PNG文件??蓪NG文件的背景設(shè)置為透明或半透明的,這樣可將其放在其他圖形的上面。這些文件存儲(chǔ)在目錄drawable-xxhdpixxhdpi(extraextra密度,即大約400Android會(huì)在必要時(shí)自動(dòng)4在nodd(reN?Drector,然后輸入目錄名。也可以使用Android資源目錄向?qū)?,但我發(fā)現(xiàn)最簡(jiǎn)單的方式就是最好的。項(xiàng)目窗4tile.xml的drawabledrawable存儲(chǔ)在目錄drawable中。這個(gè)drawable的定義如下。ticTacToev2/src/main/res/drawable/tile.xml <?xmlversion="1.0"encoding="utf-8"?><level-listxmlns:android="\h/apk/res/android"><itemandroid:drawable="@drawable/x_blue"android:maxLevel="0"/><itemandroid:drawable="@drawable/o_red"android:maxLevel="1"/><itemandroid:drawable="@drawable/tile_empty"android:maxLevel="2"/><itemandroid:drawable="@drawable/tile_available"android:maxLevel="3"/></level-list>(vb和ticTacToev2/src/main/res/drawable/tile_empty.xml <?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="\h/apk/res/android"android:shape="rectangle"><strokeandroid:width="@dimen/stroke_width"android:color="@color/dark_border_color"/><cornersandroid:radius="@dimen/corner_radius"/></shape>它定義了一個(gè)帶有深色邊框的圓角矩形。格子可下時(shí)顯示的drawable與此類似,但內(nèi)部使用了綠色(這是通過引用指定的)進(jìn)行填充。ticTacToev2/src/main/res/drawable/tile_available.xml <?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="\h/apk/res/android"android:shape="rectangle"><strokeandroid:width="@dimen/stroke_width"android:color="@color/dark_border_color"/><solidandroid:color="@color/available_color"/><cornersandroid:radius="@dimen/corner_radius"/></shape>對(duì)于屏幕上的全部81個(gè)格子,都將使用tile.xml,但可以通過設(shè)置等級(jí),讓它們呈現(xiàn)出4種可能外觀中的一種。小棋盤ticTacToev2/src/main/res/layout/small_board.xml <GridLayoutxmlns:android="\h/apk/res/android"xmlns:tools="\h/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/tile_background"android:elevation="@dimen/elevation_low"android:padding="@dimen/small_board_padding"tools:context=".GameActivity"><ImageButtonandroid:id="@+id/small1"style="@style/TileButton"android:layout_column="0"android:layout_row="0"/><ImageButtonandroid:id="@+id/small2"style="@style/TileButton"android:layout_column="1"android:layout_row="0"/><ImageButtonandroid:id="@+id/small3"style="@style/TileButton"android:layout_column="2"android:layout_row="0"/><ImageButtonandroid:id="@+id/small4"style="@style/TileButton"android:layout_column="0"android:layout_row="1"/><ImageButtonandroid:id="@+id/small5"style="@style/TileButton"android:layout_column="1"android:layout_row="1"/><ImageButtonandroid:id="@+id/small6"style="@style/TileButton"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 21036:2025 EN Plastics piping systems for industrial applications - Unplasticized polyamide (PA-U) - Metric series for specifications for components and system
- 建筑工程水電材料購(gòu)銷合同(2025年版)2篇
- 二零二五年文化產(chǎn)業(yè)投資合伙協(xié)議3篇
- 長(zhǎng)春公積金2025年度業(yè)務(wù)流程優(yōu)化合同3篇
- 2025版企業(yè)停薪留職員工心理疏導(dǎo)服務(wù)協(xié)議3篇
- 2025年度項(xiàng)目管理人員專業(yè)技能培訓(xùn)聘用協(xié)議2篇
- 2025年度醫(yī)療健康領(lǐng)域個(gè)人勞務(wù)派遣管理協(xié)議4篇
- 2025年度窗簾行業(yè)供應(yīng)鏈管理服務(wù)合同2篇
- 2025年度個(gè)性化定制住房建設(shè)合同范本4篇
- 2025年度停車場(chǎng)停車場(chǎng)智能收費(fèi)系統(tǒng)承包合同4篇
- 2023-2024學(xué)年度人教版一年級(jí)語文上冊(cè)寒假作業(yè)
- 軟件運(yùn)維考核指標(biāo)
- 空氣動(dòng)力學(xué)仿真技術(shù):格子玻爾茲曼方法(LBM)簡(jiǎn)介
- 對(duì)表達(dá)方式進(jìn)行選擇與運(yùn)用
- GB/T 18488-2024電動(dòng)汽車用驅(qū)動(dòng)電機(jī)系統(tǒng)
- 投資固定分紅協(xié)議
- 高二物理題庫(kù)及答案
- 職業(yè)發(fā)展展示園林
- 七年級(jí)下冊(cè)英語單詞默寫表直接打印
- 2024版醫(yī)療安全不良事件培訓(xùn)講稿
- 中學(xué)英語教學(xué)設(shè)計(jì)PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論