我的新書《Android自定義控制元件入門與實戰》出版啦
前言:當你回首往事時,不以虛度年華而悔恨,不以碌碌無為而羞恥,那你就可以驕傲的跟自己講,你不負此生
念念碎:
兩年前,為了深入研究自定義控制元件,堅持在CSDN上,以每週或每兩週更新一篇部落格的頻率,出版了《Android自定義控制元件三部曲》系列,中間因為業務太忙,而時時停更。最終沒能堅持下來把整個系列更完,到第三部曲檢視篇的時候,草草收尾,真是對不住大家。
後來,電子工業出版社要我出本自定義控制元件的書,當時我想這是好事,可以逼自己一把,把整個知識點更詳細地給大家講出來。耐何,我並不是一個安分的人,2017年5月份,跟朋友一起辭職創業了。
創業的時間很緊張,也很辛苦,但最終也是把這本書如期完成了,在部落格的基礎上,更新了一些實戰時用到的例項,也添加了兩章新的內容——第五章:動畫進階(Path動畫和SVG動畫),第十章:Android畫布。這本書成書有13章,本想再加兩章複雜自定義控制元件實戰的內容,以綜合運用前面學過的知識點,但單純的13章內容,已經700多頁,定價已經在150左右,但我並不想這本書賣的太貴,給大家造成負擔,所以對第一章和第十一章內容進行了精簡,這兩章的完整內容放在了電子工業出版社的資源網上供大家下載(大家可以在書的前言找到地址)。精簡之後,本書近500頁,定價在99元,這裡也非常感謝電子工業出版社的支援。由於內容過多,本想加的複雜控制元件實戰,也沒地方添加了,只能後面把他們放在我的部落格上,供大家研究。但作為入門書籍,這本書的內容基本上已經涵蓋了自定義控制元件的80%以上的知識點,相信大家在碰到複雜控制元件的時候,針對原始碼仔細分析,成功研究出來它的實現原理將不在話下。
本書介紹:
2018年7月,是個特殊的月份,在這個月,我們公司成功出售了,幾個好朋友也各自有了新的歸宿。也是這個月份,我的書也正式發行了。為了方便識別,我給它取了箇中規中矩,但比較土的名字——《Android自定義控制元件入門與實戰》
它長這個樣:
下面是它的目錄:
開 篇
第1章 繪圖基礎 2
1.1 基本圖形繪製 2
1.1.1 概述 2
1.1.2 畫筆的基本設定 4
1.1.3 Canvas使用基礎 6
1.1.4 Color 10
1.2 路徑 11
1.2.1 概述 11
1.2.2 直線路徑 12
1.2.3 弧線路徑 12
1.3 Region 14
1.3.1 構造Region 14
1.3.2 區域相交 16
1.4 Canvas(畫布) 19
1.4.1 Canvas變換 19
1.4.2 畫布的儲存與恢復 23
動 畫 篇
第2章 檢視動畫 26
2.1 檢視動畫標籤 26
2.1.1 概述 26
2.1.2 scale標籤 28
2.1.3 alpha標籤 34
2.1.4 rotate標籤 35
2.1.5 translate標籤 36
2.1.6 set標籤 37
2.2 檢視動畫的程式碼實現 38
2.2.1 概述 38
2.2.2 ScaleAnimation 38
2.2.3 AlphaAnimation 40
2.2.4 RotateAnimation 40
2.2.5 TranslateAnimation 41
2.2.6 AnimationSet 42
2.2.7 Animation 43
2.3 插值器初探 44
2.3.1 AccelerateDecelerateInterpolator 45
2.3.2 AccelerateInterpolator 47
2.3.3 DecelerateInterpolator 48
2.3.4 LinearInterpolator 49
2.3.5 BounceInterpolator 49
2.3.6 AnticipateInterpolator 50
2.3.7 OvershootInterpolator 51
2.3.8 AnticipateOvershootInterpolator 53
2.3.9 CycleInterpolator 54
2.4 動畫示例 55
2.4.1 鏡頭由遠及近效果 55
2.4.2 載入框效果 56
2.4.3 掃描動畫 57
2.5 逐幀動畫 60
2.5.1 XML實現 61
2.5.2 程式碼實現 66
第3章 屬性動畫 68
3.1 ValueAnimator的基本使用 68
3.1.1 概述 68
3.1.2 ValueAnimator的簡單使用 71
3.1.3 常用函式 74
3.1.4 示例:彈跳載入中效果 83
3.2 自定義插值器與Evaluator 86
3.2.1 自定義插值器 87
3.2.2 Evaluator 90
3.3 ValueAnimator進階――ofObject 96
3.3.1 概述 96
3.3.2 示例:拋物動畫 98
3.4 ObjectAnimator 101
3.4.1 概述 101
3.4.2 ObjectAnimator動畫原理 106
3.4.3 自定義ObjectAnimator屬性 107
3.4.4 何時需要實現對應屬性的get函式 110
3.4.5 常用函式 112
3.5 組合動畫――AnimatorSet 113
3.5.1 playSequentially()與playTogether()函式 113
3.5.2 AnimatorSet.Builder 118
3.5.3 AnimatorSet監聽器 119
3.5.4 常用函式 122
3.5.5 示例:路徑動畫 126
3.6 Animator動畫的XML實現 132
3.6.1 animator標籤 132
3.6.2 objectAnimator標籤 134
第4章 屬性動畫進階 136
4.1 PropertyValuesHolder與Keyframe 136
4.1.1 PropertyValuesHolder 137
4.1.2 Keyframe 140
4.1.3 PropertyValuesHolder之其他函式 148
4.1.4 示例:電話響鈴效果 148
4.2 ViewPropertyAnimator 150
4.2.1 概述 150
4.2.2 常用函式 150
4.2.3 效能考量 153
4.3 為ViewGroup內的元件新增動畫 153
4.3.1 animateLayoutChanges屬性 154
4.3.2 LayoutTransition 157
4.3.3 其他函式 161
4.4 開源動畫庫NineOldAndroids 163
4.4.1 NineOldAndroids中的ViewPropertyAnimator 164
4.4.2 NineOldAndroids中的ViewHelper 164
第5章 動畫進階 168
5.1 利用PathMeasure實現路徑動畫 168
5.1.1 初始化 168
5.1.2 簡單函式使用 169
5.1.3 getSegment()函式 171
5.1.4 getPosTan()函式 177
5.1.5 getMatrix()函式 181
5.1.6 示例:支付寶支付成功動畫 182
5.2 SVG動畫 184
5.2.1 概述 184
5.2.2 vector標籤與影象顯示 186
5.2.3 動態Vector 197
5.2.4 示例:輸入搜尋動畫 198
繪 圖 篇
第6章 Paint基本使用 204
6.1 硬體加速 204
6.1.1 概述 204
6.1.2 軟體繪製與硬體加速的區別 204
6.1.3 禁用GPU硬體加速的方法 206
6.2 文字 207
6.2.1 概述 207
6.2.2 繪圖四線格與FontMetrics 210
6.2.3 常用函式 214
6.2.4 示例:定點寫字 216
6.3 Paint常用函式 218
6.3.1 基本設定函式 218
6.3.2 字型相關函式 221
第7章 繪圖進階 223
7.1 貝濟埃曲線 223
7.1.1 概述 223
7.1.2 貝濟埃曲線之quadTo 227
7.1.3 貝濟埃曲線之rQuadTo 234
7.1.4 示例:波浪效果 235
7.2 setShadowLayer與陰影效果 238
7.2.1 setShadowLayer()建構函式 238
7.2.2 清除陰影 240
7.2.3 示例:給文字新增陰影 242
7.3 BlurMaskFilter發光效果與圖片陰影 243
7.3.1 概述 243
7.3.2 給圖片新增純色陰影 245
7.4 Shader與BitmapShader 248
7.4.1 Shader概述 248
7.4.2 BitmapShader的基本用法 249
7.4.3 示例一:望遠鏡效果 254
7.4.4 示例二:生成不規則頭像 256
7.5 Shader之LinearGradient 257
7.5.1 概述 257
7.5.2 示例:閃光文字效果 261
7.6 Shader之RadialGradient 264
7.6.1 雙色漸變 264
7.6.2 多色漸變 266
7.6.3 TileMode填充模式 267
第8章 混合模式 269
8.1 混合模式之AvoidXfermode 269
8.1.1 混合模式概述 269
8.1.2 AvoidXfermode 270
8.1.3 AvoidXfermode繪製原理 274
8.1.4 AvoidXfermode之Mode.AVOID 275
8.2 混合模式之PorterDuffXfermode 276
8.2.1 PorterDuffXfermode概述 276
8.2.2 顏色疊加相關模式 279
8.3 PorterDuffXfermode之源影象模式 285
8.3.1 Mode.SRC 285
8.3.2 Mode.SRC_IN 285
8.3.3 Mode.SRC_OUT 288
8.3.4 Mode.SRC_OVER 293
8.3.5 Mode.SRC_ATOP 293
8.4 目標影象模式與其他模式 294
8.4.1 目標影象模式 294
8.4.2 其他模式――Mode.CLEAR 303
8.4.3 模式總結 303
第9章 Canvas與圖層 305
9.1 獲取Canvas物件的方法 305
9.1.1 方法一:重寫onDraw()、dispatchDraw()函式 305
9.1.2 方法二:使用Bitmap建立 306
9.1.3 方法三:呼叫SurfaceHolder.lockCanvas()函式 307
9.2 圖層與畫布 307
9.2.1 saveLayer()函式 307
9.2.2 畫布與圖層 312
9.2.3 saveLayer()和saveLayerAlpha()函式的用法 312
9.3 Flag的具體含義 316
9.3.1 Flag之MATRIX_SAVE_FLAG 316
9.3.2 Flag之CLIP_SAVE_FLAG 318
9.3.3 Flag之FULL_COLOR_LAYER_SAVE_FLAG和HAS_ALPHA_
LAYER_SAVE_FLAG 320
9.3.4 Flag之CLIP_TO_LAYER_SAVE_FLAG 323
9.3.5 Flag之ALL_SAVE_FLAG 325
9.4 恢復畫布 325
9.4.1 restoreToCount(int count) 325
9.4.2 restore()與restoreToCount(int count)的關係 328
第10章 Android畫布 330
10.1 ShapeDrawable 331
10.1.1 shape標籤與GradientDrawable 331
10.1.2 ShapeDrawable的建構函式 333
10.1.3 常用函式 345
10.1.4 自定義Drawable 351
10.1.5 Drawable與Bitmap對比 357
10.2 Bitmap 359
10.2.1 概述 360
10.2.2 建立Bitmap方法之一:BitmapFactory 362
10.2.3 BitmapFactory.Options 369
10.2.4 建立Bitmap方法之二:Bitmap靜態方法 377
10.2.5 常用函式 384
10.2.6 常見問題 401
10.3 SurfaceView 408
10.3.1 概述 408
10.3.2 SurfaceView的基本用法 409
10.3.3 SurfaceView雙緩衝技術 421
第11章 Matrix與座標變換 442
視 圖 篇
第12章 封裝控制元件 444
12.1 自定義屬性與自定義Style 444
12.1.1 概述 444
12.1.2 declare-styleable標籤的使用方法 444
12.1.3 在XML中使用自定義的屬性 446
12.1.4 在程式碼中獲取自定義屬性的值 447
12.1.5 declare-styleable標籤其他屬性的用法 448
12.2 測量與佈局 452
12.2.1 ViewGroup繪製流程 452
12.2.2 onMeasure()函式與MeasureSpec 452
12.2.3 onLayout()函式 455
12.2.4 獲取子控制元件margin值的方法 460
12.3 實現FlowLayout容器 466
12.3.1 XML佈局 466
12.3.2 提取margin值與重寫onMeasure()函式 468
第13章 控制元件高階屬性 475
13.1 GestureDetector手勢檢測 475
13.1.1 概述 475
13.1.2 GestureDetector.OnGestureListener介面 475
13.1.3 GestureDetector.OnDoubleTapListener介面 479
13.1.4 GestureDetector.SimpleOnGestureListener類 483
13.1.5 onFling()函式的應用――識別是向左滑還是向右滑 485
13.2 Window與WindowManager 486
13.2.1 Window與WindowManager的關係 486
13.2.2 示例:騰訊手機管家懸浮窗的小火箭效果 487
誠如前面所言,在目錄中可以看出,本書2/3的核心內容與部落格一樣,但有些小知識點中更新了一些例項,另外相比部落格添加了兩個比較重要的章節,第五章和第十章,第五章中對動畫的高階方法做了介紹,著重介紹了Path動畫和SVG動畫,這兩個動畫相對有些難度,但實現出來的動畫效果,真的是非常棒;在第十章中,著重介紹了Android畫布,主要從原始碼角度講解了Android畫布的概念。並對幾種產生畫布的方法進行了對比,這一章主要解決大家在繪圖時,對畫布的疑惑。
當然,因為Android自定義控制元件可參考的內容不多,網上漫天飛的自定義控制元件的貼子,也大部分從我這抄來的,可參考意義不大,本書的大部分知識,也都是我自己的理解,所以難免會有不足和錯誤,希望大家以批判的精神去閱讀,如果你能發現其中的錯誤,歡迎在本篇文章下留言指正,非常感謝。
如果有幸,您讀完了這本書,覺得不錯,就算達到我的初衷了,如果您能在購買頁留下好評,我將萬分感激。
下面是各網站上電子工業出版社的購買地址,有需要的朋友,可以購買
結束語:
無論如何,非常感謝大家一直以來對我的支援。經歷了一年多的創業時光,我非常喜歡前言的那句話 —— 當你回首往事時,不以虛度年華而悔恨,不以碌碌無為而羞恥,那你就可以驕傲的跟自己講,你不負此生。
人的一生可長可短,只要敢於邁出第一步,就算失敗也並不可怕,大不了從頭再來。2018年八月份,一個新生的日子,Android開發,我又回來了。