开篇 2
第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
动画篇 26
第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 LinearInterp olator 49
2.3.5 BounceInterpolator 49
2.3.6 Antic ipateInterpolator 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 pIaySequentially()与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
绘图篇 204
第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 创建B itmap方法之一: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
视图篇 444
第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