移動互聯(lián)網(wǎng)是當(dāng)今世界發(fā)展快、市場潛力大、前景誘人的一項業(yè)務(wù),而Android則是移動互聯(lián)網(wǎng)上市場占有率很高的平臺。
《瘋狂Android講義(第三版)》是《瘋狂Android講義》的第3版,采用了Google推薦的IDE:AndroidStudio作為開發(fā)工具。《瘋狂Android講義(第三版)》介紹了Android應(yīng)用開發(fā)的相關(guān)知識,全書內(nèi)容覆蓋了Android用戶界面編程、Android四大組件、Android資源訪問、圖形/圖像處理、事件處理機制、Android輸入/輸出處理、音頻/視頻多媒體應(yīng)用開發(fā)、OpenGL與3D應(yīng)用開發(fā)、網(wǎng)絡(luò)通信編程、Android平臺的Web Service、傳感器應(yīng)用開發(fā)、GPS應(yīng)用開發(fā)、整合第三方Map服務(wù)等。
《瘋狂Android講義(第三版)》不局限于介紹Android編程的各種理論知識,而是從“項目驅(qū)動”的角度來講授理論,全書一共包括近百個實例,這些示范性的實例既可幫助讀者更好地理解各知識點在實際開發(fā)中的應(yīng)用,也可供讀者在實際開發(fā)時作為參考、拿來就用。《瘋狂Android講義(第三版)》在后面還提供了兩個實用的案例:合金彈頭和電子拍賣系統(tǒng)Android客戶端,具有極高的參考價值。《瘋狂Android講義(第三版)》提供了配套的答疑網(wǎng)站,如果讀者在閱讀《瘋狂Android講義(第三版)》時遇到了技術(shù)問題,可以登錄瘋狂Java聯(lián)盟發(fā)帖,筆者將會及時予以解答。
總編薦書,經(jīng)典與你同行 自面市以來重印30 次,發(fā)行量超16萬冊,并屢獲殊榮!
開卷數(shù)據(jù)顯示Android圖書排行榜前三
曾獲評CSDN年度具有技術(shù)影響力十大原創(chuàng)圖書
多次榮獲年度暢銷圖書及長銷圖書大獎
被工信出版集團授予年度“出版物”獎
李剛,十余年軟件開發(fā)從業(yè)經(jīng)驗,瘋狂軟件教育中心教學(xué)總監(jiān)。瘋狂Java實訓(xùn)營創(chuàng)始人,瘋狂Java體系原創(chuàng)圖書作者。廣東技術(shù)師范學(xué)院計算機科學(xué)系兼職副教授,51CTO專家門診特邀嘉賓。培訓(xùn)的學(xué)生已在華為、IBM、阿里軟件、網(wǎng)易、電信盈科等名企就職。國內(nèi)知名高端IT技術(shù)圖書作家,已出版《瘋狂Java講義》《瘋狂Android講義》《輕量級JavaEE企業(yè)應(yīng)用實戰(zhàn)》《瘋狂iOS講義(基礎(chǔ)篇)(提高篇)》《瘋狂前端開發(fā)講義》《瘋狂HTML5/CSS3/JavaScript講義》《瘋狂XML講義》《經(jīng)典JavaEE企業(yè)應(yīng)用實戰(zhàn)》《Struts2。x專業(yè)指南》等著作。其中瘋狂Java體系圖書均已沉淀多年,贏得極高的市場認同,多次重印,多部著作印刷數(shù)量超過10萬冊,并被多所“985”“211”院校選作教材,部分圖書已被翻譯成繁體中文版,授權(quán)到中國臺灣地區(qū)。
第1章Android應(yīng)用和開發(fā)環(huán)境 1
1.1Android的發(fā)展和歷史 2
1.1.1Android的發(fā)展和簡介 2
1.1.2Android 5.x平臺架構(gòu)及特性 3
1.2搭建Android開發(fā)環(huán)境 5
1.2.1安裝Android Studio 5
1.2.2下載和安裝Android SDK 8
1.2.3安裝運行、調(diào)試環(huán)境 11
1.3Android常用開發(fā)工具的用法 16
1.3.1在命令行創(chuàng)建、刪除和瀏覽AVD 16
1.3.2使用Android模擬器(Emulator) 17
1.3.3使用Monitor進行調(diào)試 18
1.3.4Android Debug Bridge(ADB)的用法 19
1.3.5使用mksdcard管理虛擬SD卡 20第1章Android應(yīng)用和開發(fā)環(huán)境 1
1.1Android的發(fā)展和歷史 2
1.1.1Android的發(fā)展和簡介 2
1.1.2Android 5.x平臺架構(gòu)及特性 3
1.2搭建Android開發(fā)環(huán)境 5
1.2.1安裝Android Studio 5
1.2.2下載和安裝Android SDK 8
1.2.3安裝運行、調(diào)試環(huán)境 11
1.3Android常用開發(fā)工具的用法 16
1.3.1在命令行創(chuàng)建、刪除和瀏覽AVD 16
1.3.2使用Android模擬器(Emulator) 17
1.3.3使用Monitor進行調(diào)試 18
1.3.4Android Debug Bridge(ADB)的用法 19
1.3.5使用mksdcard管理虛擬SD卡 20
1.4開始di一個Android應(yīng)用 21
1.4.1使用Android Studio開發(fā)及時個Android應(yīng)用 21
1.4.2通過Andorid Studio運行Android應(yīng)用 24
1.5Android應(yīng)用結(jié)構(gòu)分析 25
1.5.1創(chuàng)建一個Android應(yīng)用 25
1.5.2自動生成的R.java 28
1.5.3res目錄說明 29
1.5.4Android應(yīng)用的清單文件:AndroidManifest.xml 30
1.5.5應(yīng)用程序權(quán)限說明 31
1.6Android應(yīng)用的基本組件介紹 32
1.6.1Activity和View 32
1.6.2Service 33
1.6.3BroadcastReceiver 33
1.6.4ContentProvider 33
1.6.5Intent和IntentFilter 34
1.7簽名Android應(yīng)用程序 35
1.7.1使用Android Studio對Android應(yīng)用簽名 35
1.7.2使用命令對APK包簽名 36
1.8本章小結(jié) 37
第2章Android應(yīng)用的界面編程 38
2.1界面編程與視圖(View)組件 39
2.1.1視圖組件與容器組件 39
2.1.2使用XML布局文件控制UI界面 44
2.1.3在代碼中控制UI界面 44
實例:用編程的方式開發(fā)UI界面 44
2.1.4使用XML布局文件和Java代碼混合控制UI界面 46
實例:簡單圖片瀏覽器 46
2.1.5開發(fā)自定義View 47
實例:跟隨手指的小球 48
2.2第1組UI組件:布局管理器 49
2.2.1線性布局 50
2.2.2表格布局 52
實例:豐富的表格布局 53
2.2.3幀布局 55
實例:霓虹燈效果 57
2.2.4相對布局 58
實例:梅花布局效果 59
2.2.5網(wǎng)格布局 60
實例:計算器界面 61
2.2.6布局 62
實例:登錄界面 63
2.3第2組UI組件:TextView及其子類 64
2.3.1文本框(TextView)與編輯框(EditText)的功能和用法 64
實例:不同顏色、字體、帶鏈接的文本 67
實例:圓角邊框、漸變背景的TextView 68
2.3.2EditText的功能與用法 70
實例:用戶友好的輸入界面 70
2.3.3按鈕(Button)組件的功能與用法 72
實例:按鈕、圓形按鈕、帶文字的圖片按鈕 72
2.3.4使用9Patch圖片作為背景 73
2.3.5單選鈕(RadioButton)和復(fù)選框(CheckBox)的功能與用法 74
實例:利用單選鈕、復(fù)選框獲取用戶信息 75
2.3.6狀態(tài)開關(guān)按鈕(ToggleButton)和開關(guān)(Switch)的功能與用法 77
實例:動態(tài)控制布局 77
2.3.7時鐘(AnalogClock和TextClock)的功能與用法 79
實例:手機里的“勞力士” 79
2.3.8計時器(Chronometer) 80
2.4第3組UI組件:ImageView及其子類 81
實例:圖片瀏覽器 83
實例:強大的圖片按鈕 86
實例:使用QuickContactBadge關(guān)聯(lián)聯(lián)系人 87
2.5第4組UI組件:AdapterView及子類 88
2.5.1列表視圖(ListView)和ListActivity 89
實例:改變分隔條、基于數(shù)組的ListView 90
2.5.2Adapter接口及實現(xiàn)類 91
實例:使用ArrayAdapter創(chuàng)建ListView 91
實例:基于ListActivity實現(xiàn)列表 93
實例:使用SimpleAdapter創(chuàng)建ListView 94
實例:擴展BaseAdapter實現(xiàn)不存儲列表項的ListView 97
2.5.3自動完成文本框(AutoCompleteTextView)的功能與用法 98
2.5.4網(wǎng)格視圖(GridView)的功能與用法 100
實例:帶預(yù)覽的圖片瀏覽器 101
2.5.5可展開的列表組件(ExpandableListView) 103
2.5.6Spinner的功能與用法 106
實例:讓用戶選擇 106
2.5.7AdapterViewFlipper的功能與用法 108
實例:自動播放的圖片庫 108
2.5.8StackView的功能與用法 111
實例:疊在一起的圖片 111
2.6第5組UI組件:ProgressBar及其子類 112
2.6.1進度條(ProgressBar)的功能與用法 113
實例:顯示在標(biāo)題上的進度條 116
2.6.2拖動條(SeekBar)的功能與用法 117
實例:通過拖動滑塊來改變圖片的透明度 117
2.6.3星級評分條(RatingBar)的功能與用法 118
實例:通過星級改變圖片的透明度 119
2.7第6組UI組件:ViewAnimator及其子類 120
2.7.1ViewSwitcher的功能與用法 120
實例:仿Android系統(tǒng)Launcher界面 120
2.7.2圖像切換器(ImageSwitcher)的功能與用法 125
實例:支持動畫的圖片瀏覽器 125
2.7.3文本切換器(TextSwitcher)的功能與用法 127
2.7.4ViewFlipper的功能與用法 129
實例:自動播放的圖片庫 129
2.8各種雜項組件 131
2.8.1使用Toast顯示提示信息框 131
實例:帶圖片的消息提示 131
2.8.2日歷視圖(CalendarView)組件的功能和用法 133
實例:選擇您的生日 133
2.8.3日期、時間選擇器(DatePicker和TimePicker)的功能和用法 134
實例:用戶選擇日期、時間 135
2.8.4數(shù)值選擇器(NumberPicker)的功能與用法 137
實例:選擇您意向的價格范圍 137
2.8.5搜索框(SearchView)的功能與用法 139
實例:搜索 139
2.8.6選項卡(TabHost)的功能和用法 141
實例:通話記錄界面 141
2.8.7滾動視圖(ScrollView)的功能和用法 143
實例:可垂直和水平滾動的視圖 144
2.8.8Notification的功能與用法 144
實例:加薪通知 145
2.9第7組UI組件:對話框 146
2.9.1使用AlertDialog創(chuàng)建對話框 147
實例:顯示提示消息的對話框 147
實例:簡單列表項對話框 149
實例:單選列表項對話框 149
實例:多選列表項對話框 150
實例:自定義列表項對話框 151
實例:自定義View對話框 152
2.9.2對話框風(fēng)格的窗口 154
2.9.3使用PopupWindow 155
2.9.4使用DatePickerDialog、TimePickerDialog 156
2.9.5使用ProgressDialog創(chuàng)建進度對話框 158
2.10菜單 160
2.10.1選項菜單和子菜單(SubMenu) 161
2.10.2使用監(jiān)聽器來監(jiān)聽菜單事件 164
2.10.3創(chuàng)建多選菜單項和單選菜單項 164
2.10.4設(shè)置與菜單項關(guān)聯(lián)的Activity 165
2.10.5上下文菜單 166
2.10.6使用XML文件定義菜單 167
實例:使用XML資源文件定義菜單 168
2.10.7使用PopupMenu創(chuàng)建彈出式菜單 171
2.11使用活動條(ActionBar) 173
2.11.1啟用ActionBar 173
2.11.2使用ActionBar顯示選項菜單項 174
2.11.3啟用程序圖標(biāo)導(dǎo)航 176
2.11.4添加Action View 177
實例:“標(biāo)題”上的時鐘 177
2.11.5使用ActionBar實現(xiàn)Tab導(dǎo)航 178
實例:ActionBar結(jié)合Fragment實現(xiàn)Tab導(dǎo)航 179
實例:Android 3.0以前的Fragment支持 182
2.11.6使用ActionBar實現(xiàn)下拉式導(dǎo)航 185
實例:ActionBar結(jié)合Fragment實現(xiàn)下拉式導(dǎo)航 185
2.12本章小結(jié) 187
第3章Android的事件處理 188
3.1Android事件處理概述 189
3.2基于監(jiān)聽的事件處理 189
3.2.1監(jiān)聽的處理模型 189
3.2.2事件和事件監(jiān)聽器 192
實例:控制飛機移動 192
3.2.3內(nèi)部類作為事件監(jiān)聽器類 195
3.2.4外部類作為事件監(jiān)聽器類 195
3.2.5Activity本身作為事件監(jiān)聽器類 197
3.2.6匿名內(nèi)部類作為事件監(jiān)聽器類 197
3.2.7直接綁定到標(biāo)簽 198
3.3基于回調(diào)的事件處理 199
3.3.1回調(diào)機制與監(jiān)聽機制 199
3.3.2基于回調(diào)的事件傳播 201
3.3.3重寫onTouchEvent方法響應(yīng)觸摸屏事件 202
實例:通過回調(diào)實現(xiàn)跟隨手指的小球 203
3.4響應(yīng)系統(tǒng)設(shè)置的事件 204
3.4.1Configuration類簡介 204
實例:獲取系統(tǒng)設(shè)備狀態(tài) 205
3.4.2重寫onConfigurationChanged方法響應(yīng)系統(tǒng)設(shè)置更改 206
實例:監(jiān)聽屏幕方向的改變 206
3.5Handler消息傳遞機制 208
3.5.1Handler類簡介 208
實例:自動播放動畫 209
3.5.2Handler、Loop、MessageQueue的工作原理 210
實例:使用新線程計算質(zhì)數(shù) 211
3.6異步任務(wù)(AsyncTask) 213
實例:使用異步任務(wù)執(zhí)行下載 214
3.7本章小結(jié) 217
第18章合金彈頭
本章要點
● 開發(fā)射擊類游戲的基本方法
● 游戲的界面分解和分析
● 游戲界面組件的分析和實現(xiàn)
● 怪物的移動和發(fā)射子彈
● 實現(xiàn)角色移動、跳躍、發(fā)射子彈等行為
● 檢測子彈是否命中目標(biāo)
● 實現(xiàn)游戲的繪圖工具類
● 管理游戲資源
● 繼承SurfaceView實現(xiàn)游戲主組件
● 掌握SurfaceView的繪圖機制
● 使用多線程實現(xiàn)游戲動畫
● 實現(xiàn)游戲的Activity
18.2 開發(fā)游戲界面組件
在開發(fā)游戲之前,首先需要從程序員的角度來分析游戲界面,并逐步實現(xiàn)游戲界面上的各種組件。
18.2.1 游戲界面分析
對于圖18.1所示的游戲界面,從普通玩家的角度來看,他會看到游戲界面上有受玩家控制移動、跳躍、發(fā)射子彈的角色,還有不斷發(fā)射子彈的敵人、地上有炸彈、天空中有正在爆炸的飛機……乍看上去會給人眼花繚亂的感覺。
如果從程序員的角度來看,游戲界面大致可分為如下組件。
游戲背景:只是一張靜止的圖片。
角色:該角色可以站立、走動、跳躍、射擊。
怪物:怪物類代表了游戲界面上所有的敵人,包括拿槍的敵人、地上的炸彈、天空中的飛機……雖然這些怪物的圖片不同、發(fā)射的子彈不同,攻擊力也可能不同,但這些只是實例與實例之間的差異,因此程序只要為怪物定義一個類即可。
子彈:不管是角色發(fā)射的子彈還是怪物發(fā)射的子彈,都可歸納為子彈類。雖然不同子彈的圖片不同,攻擊力不同,但這些只是實例與實例之間的差異,因此程序只要為子彈定義一個類即可。
從上面介紹不難看出,開發(fā)這款游戲,主要就是實現(xiàn)上面的角色、怪物和子彈3個類。
18.2.2 實現(xiàn)“怪物”類
由于不同怪物之間會存在各種差異,那么此處就需要為怪物類定義相應(yīng)的實例變量來記錄這些差異。不同怪物之間可能存在如下差異。
怪物的類型。
代表怪物位置的X、Y坐標(biāo)。
標(biāo)識怪物是否已經(jīng)死亡的旗標(biāo)。
繪制怪物圖片左上角的X、Y坐標(biāo)。
繪制怪物圖片右下角的X、Y坐標(biāo)。
怪物發(fā)射的所有子彈。(有的怪物不會發(fā)射子彈)
怪物未死亡時所有的動畫幀圖片和怪物死亡時所有的動畫幀圖片。
本程序并未把怪物的所有動畫幀圖片直接保存在怪物實例中,本程序?qū)iT使用一個工具類來保存所有角色、怪物的所有動畫幀圖片。
為了讓游戲界面的角色、怪物都能“動起來”,程序的實現(xiàn)思路是這樣的:程序會專門啟動一條獨立的線程,這條線程負責(zé)控制角色、怪物不斷地更換新的動畫幀圖片——因此程序需要為怪物增加一個成員變量來記錄當(dāng)前游戲界面正在繪制怪物動畫的第幾幀,而負責(zé)動畫的獨立線程只要不斷地調(diào)用怪物的繪制方法即可——實際上該繪制方法每次只是繪制一張靜態(tài)圖片(這張靜態(tài)圖片是怪物動畫的其中一幀)。
下面是怪物類的成員變量部分。
程序清單:codes\18\MetalSlug\app\src\main\java\org\crazyit\metalslug\comp\Monster.java
// 定義代表怪物類型的常量(如果程序還需要增加更多怪物,只需在此處添加常量即可)
public static final int TYPE_BOMB = 1;
public static final int TYPE_FLY = 2;
public static final int TYPE_MAN = 3;
// 定義怪物類型的成員變量
private int type = TYPE_BOMB;
// 定義怪物X、Y坐標(biāo)的成員變量
private int x = 0;
private int y = 0;
// 定義怪物是否已經(jīng)死亡的旗標(biāo)
private boolean isDie = false;
// 繪制怪物圖片左上角的X坐標(biāo)
private int startX = 0;
// 繪制怪物圖片左上角的Y坐標(biāo)
private int startY = 0;
// 繪制怪物圖片右下角的X坐標(biāo)
private int endX = 0;
// 繪制怪物圖片右下角的Y坐標(biāo)
private int endY = 0;
// 該變量用于控制動畫刷新的速度
int drawCount = 0;
// 定義當(dāng)前正在繪制怪物動畫的第幾幀的變量
private int drawIndex = 0;
// 用于記錄死亡動畫只繪制一次,不需要重復(fù)繪制
// 每當(dāng)怪物死亡時,該變量會被初始化為等于死亡動畫的總幀數(shù)
// 當(dāng)怪物的死亡動畫幀播放完成時,該變量的值變?yōu)?
private int dieMaxDrawCount = Integer.MAX_VALUE;
// 定義怪物射出的子彈
private List bulletList = new ArrayList();
上面的成員變量即可記錄該怪物實例的各種狀態(tài)。實際上以后程序要升級,比如為怪物增加更多的特征,如怪物可以拿不同的武器,怪物可以穿不同的衣服,怪物可以具有不同的攻擊力……這些都可考慮定義成怪物的成員變量。
下面是怪物類的構(gòu)造器,該構(gòu)造器只要傳入一個type參數(shù)即可,該type參數(shù)告訴系統(tǒng),該怪物是哪種類型的怪物。
程序清單:codes\18\MetalSlug\app\src\main\java\org\crazyit\metalslug\comp\Monster.java
public Monster(int type)
{
this.type = type;
// -------下面代碼根據(jù)怪物類型來初始化怪物X、Y坐標(biāo)------
// 如果怪物是炸彈(TYPE_BOMB)或敵人(TYPE_MAN)
// 怪物的Y坐標(biāo)與玩家控制的角色的Y坐標(biāo)相同
if (type == TYPE_BOMB || type == TYPE_MAN)
{
y = Player.Y_DEFALUT;
}
// 如果怪物是飛機,根據(jù)屏幕高度隨機生成怪物的Y坐標(biāo)
else if (type == TYPE_FLY)
{
y = ViewManager.SCREEN_HEIGHT 50 / 100
- Util.rand((int) (ViewManager.scale 100));
}
// 隨機計算怪物的X坐標(biāo)。
x = ViewManager.SCREEN_WIDTH Util.rand(ViewManager.SCREEN_WIDTH >> 1)
- (ViewManager.SCREEN_WIDTH >> 2);
}
從上面的粗體字代碼可以看出,程序在創(chuàng)建怪物實例時,不僅負責(zé)初始化怪物的type成員變量,還會根據(jù)怪物類型來設(shè)置怪物的X、Y坐標(biāo)。
如果怪物是炸彈和拿槍的人(都在地面上),那么它們的Y坐標(biāo)與角色默認的Y坐標(biāo)(在地面上)相同。如果怪物是飛機,那么怪物的Y坐標(biāo)是隨機計算的。
不管什么怪物,它的X坐標(biāo)都是隨機計算的。
上面程序中還用到一個Util工具類,該工具類僅僅包含一個計算隨機數(shù)的方法。下面是該工具類的代碼。
程序清單:codes\18\MetalSlug\app\src\main\java\org\crazyit\metalslug\comp\Util.java
public class Util
{
public static Random random = new Random();
// 返回一個0~range的隨機數(shù)
public static int rand(int range)
{
// 如果range為0,直接返回0
if (range == 0)
return 0;
// 獲取一個0~range之間的隨機數(shù)
return Math.abs(random.nextInt() % range);
}
}
前面已經(jīng)介紹了繪制怪物動畫的思路:程序?qū)捎煤笈_線程來控制不斷地繪制怪物動畫的下一幀,但實際上每次繪制的只是怪物動畫的某一幀。下面是繪制怪物的方法。
程序清單:codes\18\MetalSlug\app\src\main\java\org\crazyit\metalslug\comp\Monster.java
// 繪制怪物的方法
public void draw(Canvas canvas)
{
if (canvas == null)
{
return;
}
switch (type)
{
case TYPE_BOMB:
// 死亡的怪物用死亡圖片
drawAni(canvas, isDie ? ViewManager.bomb2Image : ViewManager.bombImage);
break;
case TYPE_FLY:
// 死亡的怪物用死亡圖片
drawAni(canvas, isDie ? ViewManager.flyDieImage : ViewManager.flyImage);
break;
case TYPE_MAN:
// 死亡的怪物用死亡圖片
drawAni(canvas, isDie ? ViewManager.manDieImage : ViewManager.manImgae);
break;
default:
break;
}
}
// 根據(jù)怪物的動畫幀圖片來繪制怪物動畫
public void drawAni(Canvas canvas, Bitmap[] bitmapArr)
{
if (canvas == null)
{
return;
}
if (bitmapArr == null)
{
return;
}
// 如果怪物已經(jīng)死亡,且沒有播放過死亡動畫
//(dieMaxDrawCount等于初始值表明未播放過死亡動畫)
if (isDie && dieMaxDrawCount == Integer.MAX_VALUE)
{
// 將dieMaxDrawCount設(shè)置為與死亡動畫的總幀數(shù)相等
dieMaxDrawCount = bitmapArr.length; // ⑤
}
drawIndex = drawIndex % bitmapArr.length;
// 獲取當(dāng)前繪制的動畫幀對應(yīng)的位圖
Bitmap bitmap = bitmapArr[drawIndex]; // ①
if (bitmap == null || bitmap.isRecycled())
{
return;
}
int drawX = x;
// 對繪制怪物動畫幀位圖的X坐標(biāo)進行微調(diào)
if (isDie)
{
if (type == TYPE_BOMB)
{
drawX = x - (int) (ViewManager.scale 50);
}
else if (type == TYPE_MAN)
{
drawX = x (int) (ViewManager.scale 50);
}
}
// 對繪制怪物動畫幀位圖的Y坐標(biāo)進行微調(diào)
int drawY = y - bitmap.getHeight();
// 繪制怪物動畫幀的位圖
Graphics.drawMatrixImage(canvas, bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), Graphics.TRANS_NONE, drawX, drawY, 0,
Graphics.TIMES_SCALE);
startX = drawX;
startY = drawY;
endX = startX bitmap.getWidth();
endY = startY bitmap.getHeight();
drawCount ;
// 后面的6、4用于控制人、飛機發(fā)射子彈的速度
if (drawCount >= (type == TYPE_MAN ? 6 : 4)) // ③
{
// 如果怪物是人,只在第3幀才發(fā)射子彈
&nbs
在當(dāng)當(dāng)上面買,就是買放心,懶得折騰,書是正品,包裝也很好,關(guān)鍵是物流非常快,晚上下的訂單,第二天上午就到了,非常nice
比起視頻學(xué)習(xí),還是買書靠譜點,很適合我這種初學(xué)者
為單位買的學(xué)習(xí)的好書值得購買非常好,很滿意,物流快
基本的知識點都講解單位了,作為入門提高的書是很適合的
需要一本用as開發(fā)的書來了解這個ide,因此選擇了這本書
初學(xué)者的工具書。在google上不了的情況下。
書到手真的好厚啊,不過當(dāng)當(dāng)還是一如既往的劃算,發(fā)貨也快
下完單第二天就收到了 書特別厚 講的很詳細 適合入門的人使用 不過要有一點java基礎(chǔ)
書不錯,內(nèi)容好,質(zhì)量也好。大家在這上面買那本瘋狂JAVA講義時要小心了,書的質(zhì)量不是一般的差,翻了幾頁整個屋里都是刺鼻的味道,,,沒有最差,只有更差
速度確實很快,不過包裝吧,這個我要吐槽一下,有點簡陋,內(nèi)容大題看了一下,很豐富,很適合初學(xué)人士,希望用這個可以提高一些能力,謝謝合作
書紙張不錯,安卓入門的話還是第一行代碼要好一些!這本書一開始羅列了太多知識點,容易讓新手知難而退
好厚啊我的哥,為啥不分成上下兩冊,估計這本大厚書我還沒看到后面就已經(jīng)散架了。
這次包裝不太好,只有一層快遞袋包著,書都皺了
內(nèi)容還沒來得及看,物流給個大大的好評,晚上下單 第二天上午就到了,驚喜! 沈陽黃馬甲 ,贊。書的評價之后補充。
感覺不是很好,慢慢看吧,可能當(dāng)做工具書比較合適
老師一直推薦這本書很不錯,我也稍微看了一下,覺得挺好的,于是就買了。買來翻看了一下,里面好多實例,每章都有。是一本很實用的書。
非常好的一本Android學(xué)習(xí)教程,內(nèi)容豐富,例子詳盡,實用性強!
不錯不錯。正版書籍,值得一看。物流也很給力,第二天就到了。我選的是貨到刷卡支付方式,結(jié)果不能刷卡付款,最終還是現(xiàn)金付的,有點遺憾。
包裝確實不咋滴,主要是書角有點扭了,書本來就挺厚的,磕磕碰碰復(fù)原不過來的,一層氣泡膜是包小書的吧,來的時候從書的翻頁的地方包回來,書角都沒包不到,挺遺憾的,一本好書。
內(nèi)容全面,很經(jīng)典的書,學(xué)習(xí)android應(yīng)用開發(fā),這一本就足夠了
包裝不錯哦,整體感覺不錯,性價比很高,印刷很正,字跡清晰,紙質(zhì)好。排版也不錯。適合入門,不錯信息更新?lián)Q代快,如果用最新版軟件,會有一些差異,不過不影響學(xué)習(xí)。
Android Studio至今沒多少人為它寫教程,這本書做到了。如果能列出更多的控件就更適合初學(xué)者了。
200-100活動買的,劃算。然后湊夠20字拿3000+積分!!!然后湊夠20字拿3000+積分!!!然后湊夠20字拿3000+積分!!!然后湊夠20字拿3000+積分!!!然后湊夠20字拿3000+積分!!!
學(xué)Android必備的書籍,講的挺詳細的,一如李剛的風(fēng)格
書很不錯,涵蓋面廣,適合有一定編程經(jīng)驗的Android新手,值得推薦
本書并不局限于介紹Android編程的各種理論知識,而是從“項目驅(qū)動”的角度來講授理論,全書一共包括近百個實例,這些示范性的實例既可幫助讀者更好地理解各知識點在實際開發(fā)中的應(yīng)用,也可供讀者在實際開發(fā)時作為參考、拿來就用。本書*后還提供了兩個實用的案例:合金彈頭和電子拍賣系統(tǒng)Android客戶端,具有極高的參考價值。本書提供了配套的答疑網(wǎng)站,如果讀者在閱讀本書時遇到了技術(shù)問題,可以登錄瘋狂Java聯(lián)盟發(fā)帖,筆者將會及時予以解答。
這本書是很好的入門書籍,可以鞏固以及了解所有變成的基本概念,是比較基礎(chǔ)的一些實例,這套書不是長篇大論的講理論,很適合有些基礎(chǔ)的程序員,在開發(fā)過程中遇到的問題里面幾乎都有講解,可以當(dāng)做工具書用,真心不錯,值得推薦