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