Android自定義控件開發入門與實戰
  • 推薦17
  • 收藏32
  • 瀏覽7.5K

Android自定義控件開發入門與實戰

啟艦 (作者) 

  • 書  號:978-7-121-34556-2
  • 出版日期:2018-07-11
  • 頁  數:504
  • 開  本:16(185*260)
  • 出版狀態:上市銷售
  • 維護人:付睿
紙質版 ¥99.00
在Android中,官方提供的控件是非常有限的,而我們所面臨的需求卻是多樣的。大家在工作中難免會接觸到自定義控件的需求,但系統講解自定義控件知識的書籍卻少之又少。不僅因為自定義控件涉及的知識豐富、繁雜,而且與動畫和色彩相關的知識很難在紙張上表現出來。
本書從自定義控件的動畫、繪圖、視圖三方面入手,分別講解與自定義控件相關的各種知識,給大家系統地梳理相關知識點,并且通過翔實的案例講解每個知識點在現實工作中所能實現的功能。
從動畫、繪圖、視圖三方面介紹Android自定義控件相關知識,配以翔實的案例講解每個知識點,既適合系統學習,又可以用于查漏補缺。
前言

在我剛入門Android的時候,就被各種自定義控件所吸引,但當真正想要自己去制作時,由于涉及的知識太多,所以根本無從下手。而且我在搜索網頁時也發現,與自定義控件相關的知識非常少,大都是一些例子的源碼,講解的內容非常有限。從那時起,我便想,如果我學會了自定義控件,就要寫一系列博文,把相關的知識梳理清楚,供后來者參考。
從2015年起,我便著重積累這方面的知識。從2016年1月起,我基本保持每兩周一篇博文的頻率在CSDN上公開發表。在不知不覺間,我已經連續更新了二十幾篇博文,得到了很多朋友的喜歡和贊揚。我當初更新博客的目的很簡單,一方面,能夠梳理知識點,以防自己忘記;另一方面,能為后來者做一點事,希望大家在學習自定義控件時,不必像我這樣費勁。
后來,電子工業出版社的付睿編輯聯系到我,想讓我把與自定義控件相關的知識整理成書。剛開始我是猶豫的,因為紙質媒介很難表現出自定義控件所特有的動畫和色彩。為此,電子工業出版社給予了我很大的支持,在官網上添加博客功能,方便我的動態圖片上傳到后臺,進而將圖片地址制作成二維碼,供大家掃描觀看。這一突破性的想法解決了我的后顧之憂。非常感謝他們的支持!
我在阿里巴巴工作的時候,在時間上是非常緊張的,從每天早上9點到晚上9點是正常的上下班時間。為了寫書,我每天早上保證7點到公司,寫到9點,然后再回工位上班;周末基本上也都在準備資料、寫代碼、寫書中度過。這讓我原本非常緊張的生活變得更加緊張。
然而我又是一個不安分的人,我于2017年4月從阿里巴巴辭職,跟朋友一起去創業。創業路上的艱辛是我所沒有預見的,原本不多的時間被瓜分得更是少之又少,只能每天熬夜寫作。
非常感謝我的妻子聶倩,在這兩年里,基本上沒有時間陪你,是你的寬容與支持才有了這本書的成稿。同時,也要感謝我的小公主雯雯,如果不是你的到來,我就不會體會到為人父的快樂,是你讓我在工作中充滿了力量。感謝灰灰,從創業開始就隨我四處奔波,不離不棄。感謝博哥,在公司最困難的時候,選擇留下來共渡難關。感謝你們在公司走上正軌后,為我承擔了工作中大部分的責任,讓我能安心地完成本書。
本書開篇主要講解了入門自定義控件所需的一些必備知識;在動畫篇中,詳細講解了在Android中制作動畫的幾種方法;在繪圖篇中,具體講解了與繪圖相關的知識;在視圖篇中,主要講解了控件本身所涉及的一些知識。
在寫作過程中,我盡量做到兩點。第一,講通、講透。以我的理解,講解出相關的知識所涉及的方方面面,力爭讓大家不再需要自己找資料,就可以全面理解這些知識。當然,本書中的有些內容在網上是找不到的,都是根據個人經驗而得出的結論,難免有所偏失,如有不足,還望指正。第二,實例交織。我盡量在每個知識點中都加入一些實戰中的例子,方便大家理解。
為了做到這兩點,本書內容非常多,我把相對不重要的內容遷移到網上,大家可以到網上繼續閱讀。同時,本書的前后章節是經過嚴格推敲的,大家切勿跳章學習,必須按照順序逐步進行。雖然我會給大家提供源碼,但是請大家自己把代碼敲一遍,因為只有動手寫過的東西,才真正是自己的。
我在更新博客時,喜歡在每篇博文前加一句序言來激勵自己。在本書中,我在每章前仍會加一句序言。本書第1章的序言是我非常喜歡的一句話,送給大家:迷茫,本就是青春該有的樣子,但不要讓未來的你討厭現在的自己。

目錄

開 篇
第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

    2,第39頁,從底部向上數第三行的,ScaleAnimation構造函數中的0.5f和上面xml中的pivotX=“50”, pivotY=“50”不是對應的,0.5f對應的是50%而不是50

    家和萬事興 提交于 2018/9/30 15:37:21
    付睿 確認于 2018/10/18 15:25:17
  •  •  印次: 7

    7,第54頁底部二維碼左側的代碼中,有三個tranlate中少了s,應該是translate

    家和萬事興 提交于 2018/9/30 23:36:24
    付睿 確認于 2018/10/18 15:28:22
  • 頁碼:12  •  印次: 12

    12,第99頁二維碼下面的一行中”(drawable/cirlce.xml)”中cirlce單詞拼寫錯誤,這個單詞應該是圓circle;在底部的布局代碼中也有一個錯誤,ImageView中android:src=”@drawable/cicle”一句中cicle拼寫錯誤,應該是circle

    家和萬事興 提交于 2018/10/5 20:29:45
    付睿 確認于 2018/10/18 15:24:42
  • 頁碼:43  •  行數:10  •  印次: 2

    new AlphaAnimation(1.0f,0.1f)應該換成(0.1f,1.0f)

    超大只烏龜 提交于 2018/12/22 10:25:28
    付睿 確認于 2019/6/21 13:20:42
  • 頁碼:43  •  行數:第2個代碼塊  •  印次: 2  •  修訂印次: 5

    18年10月第2次印刷的版次中,43頁第2個代碼塊,最后tv.startAnimation(AnimationSet)應改為tv.startAnimation(setAnim).

    奔跑的棉花糖 提交于 2019/10/29 15:42:12
    付睿 確認于 2019/11/11 10:41:50

讀者評論

  • 請問完整版怎么看呢

    sutingshuai發表于 2020/2/25 22:25:01
  • 為什么資源下載后綴是.bin,不應該是pdf嗎?

    final_alex發表于 2019/12/31 0:48:43
    • 是pdf啊。。。您再試試。

      付睿發表于 2020/2/11 11:38:59
  • 關于Paint那里setStyle(),FILL_AND_STROKE只比FILL多了半個描邊的寬度,望改進 ??!

    Sha得像小新發表于 2019/12/3 16:33:01
    • 收到。

      付睿發表于 2019/12/11 8:59:28
    • @付睿 啥意思,不是多了一個描邊的寬度嗎

      sutingshuai發表于 2020/2/25 22:27:24
    • @sutingshuai 您在勘誤里提交一下,我跟作者確認一下哈。

      付睿發表于 2020/3/6 10:32:22
  • 第1章和11章資源怎么一直下不下來?

    milkz發表于 2019/11/30 10:13:29
    • 改天再來試試,有的時候系統不是很穩定

      付睿發表于 2019/12/2 13:14:21
  • 源碼的結構看起來怎么這么奇怪,跑不起來

    renext發表于 2019/4/27 11:32:08
    • 請具體描述問題,謝謝。

      付睿發表于 2019/12/11 9:00:05

相關圖書

Android音視頻開發

何俊林 (作者)

近年來,直播、短視頻行業的相關業務發展迅猛,本書主要介紹其中涉及的Android音視頻開發相關技術。本書一共有11章,分別介紹了音視頻基礎知識、MediaPla...

¥69.00

Android進階解密

劉望舒 (作者)

本書是一本Android進階書籍,主要針對Android 8.0系統源碼并結合應用開發相關知識進行介紹。本書共分為17章,從3個方面來組織內容。<br>第一方面...

¥69.00

深入剖析Android新特性

強波 (作者)

本書對最近幾個版本(5.0 ~ 8.0)的主要新增功能進行整理和解析,本書的重點不僅僅是講解這些新增功能特性的外部行為,而是在結合AOSP的源碼基礎上,解析這些...

¥79.00

Android應用開發進階

范磊 (作者)

本書為Android應用開發進階的參考用書,旨在幫助Android開發者能夠快速有效地掌握Andriod應用開發進階相關的知識點。本書內容為Android應用開...

¥89.00

Android組件化架構

曾家樂 (作者)

本書首先介紹Android組件化開發的基礎知識,剖析組件化的開發步驟和常見問題,探究組件化編譯原理和編譯優化措施。其次在項目架構上,介紹如何組織團隊來使用組件化...

¥79.00

揭秘Kotlin編程原理

封亞飛 (作者)

Kotlin在今年的Google I/O大會上被確定為Android開發的一類語言,從而引發了大家的學習熱情。本書詳細介紹了Kotlin的程序結構、變量與常量、...

¥79.00
国际官方棋牌下载中心 湖北11选5杀号技巧 佳永配资-配资平台那个好 山西快乐10分钟查询 快三平台登陆 好的股票推荐网站 内蒙体育彩票11选5 福彩快乐12玩法规则 东北期货配资 甘肃11选5胆拖规则 山西快乐10分中奖玩法