Android 自定义控件目录「理论」

本篇从自定义控件的动画、绘图、视图三方面入手,分别讲解与自定义控件相关的各种知识,给大家系统的梳理相关知识。不仅适合 Android 初、中级水平从业者,也适合高水平从业者查漏补缺使用。

内容摘自启舰所著的书籍《Android 自定义控件开发入门与实践》

第1章 绘图基础

1.1 基本图形绘制

1.1.1 概述
1.1.2 画笔的基本设置
1.1.3 Canvas使用基础
1.1.4 Rect与RectF
1.1.5 Color

1.2 路径

1.2.1 概述
1.2.2 直线路径
1.2.3 弧线路径
1.2.4 addXXX系列函数
1.2.5 填充模式
1.2.6 重置路径
1.2.7 示例:蜘蛛网状图

1.3 文字

1.3.1 Paint设置
1.3.2 Canvas绘制文本
1.3.3 设置字体样式

1.4 Region

1.4.1 构造Region
1.4.2 枚举区域——RegionIterator类
1.4.3 区域相交
1.4.4 其他函数

1.5 Canvas(画布)

1.5.1 Canvas变换
1.5.2 画布的保存与恢复
1.5.3 示例一:圆形头像
1.5.4 示例二:裁剪动画

1.6 控件的使用方法

1.6.1 控件概述
1.6.2 通过XML引入控件
1.6.3 动态添加控件

第2章 视图动画

2.1 视图动画标签

2.1.1 概述
2.1.2 scale 标签
2.1.3 Animation 继承属性
2.1.4 alpha 标签
2.1.5 rotate 标签
2.1.6 translate 标签
2.1.7 set 标签

2.2 视图动画的代码实现

2.2.1 概述
2.2.2 ScaleAnimation
2.2.3 AlphaAnimation
2.2.4 RotateAnimation
2.2.5 TranslateAnimation
2.2.6 AnimationSet
2.2.7 Animation

2.3 插值器初探

2.3.1 AccelerateDecelerateInterpolator
2.3.2 AccelerateInterpolator
2.3.3 DecelerateInterpolator
2.3.4 LinearInterpolator
2.3.5 BounceInterpolator
2.3.6 AnticipateInterpolator
2.3.7 OvershootInterpolator
2.3.8 AnticipateOvershootInterpolator
2.3.9 CycleInterpolator

2.4 动画示例

2.4.1 镜头由远及近效果
2.4.2 加载框效果
2.4.3 扫描动画

2.5 逐帧动画

2.5.1 XML 实现
2.5.2 代码实现

第3章 属性动画

3.1 ValueAnimator 的基本使用

3.1.1 概述
3.1.2 ValueAnimator 的简单使用
3.1.3 常用函数
3.1.4 示例:弹跳加载中效果

3.2 自定义插值器与 Evaluator

3.2.1 自定义插值器
3.2.2 Evaluator

3.3 ValueAnimator 进阶——ofObject

3.3.1 概述
3.3.2 示例:抛物动画

3.4 ObjectAnimator

3.4.1 概述
3.4.2 ObjectAnimator 动画原理
3.4.3 自定义 ObjectAnimator 属性
3.4.4 何时需要实现对应的 get 函数
3.4.5 常用函数

3.5 组合动画——AnimatorSet

3.5.1 playSequentially() 与 playTogether() 函数
3.5.2 AnimatorSet.Builder
3.5.3 AnimatorSet 监听器
3.5.4 常用函数
3.5.5 示例:路径动画

3.6 Animator 动画的 XML 实现

3.6.1 animator 标签
3.6.2 objectAnimator 标签
3.6.3 set 标签

第4章 属性动画进阶

4.1 PropertyValuesHolder 与 Keyframe

4.1.1 PropertyValuesHolder
4.1.2 Keyframe
4.1.3 PropertyValuesHolder 其他函数
4.1.4 示例:电话响铃效果

4.2 ViewPropertyAnimator

4.2.1 概述
4.2.2 常用函数

4.3 为 ViewGroup 内的组件添加动画

4.3.1 animateLayoutChanges 属性
4.3.2 LayoutTransition
4.3.3 其他函数

4.4 开源动画库 NineOldAndroids

4.4.1 NineOldAndroids 中的 ViewPropertyAnimator
4.4.2 NineOldAndroids 中的 ViewHelper

第5章 动画进阶

5.1 利用 PathMeasure 实现路径动画

5.1.1 初始化
5.1.2 简单函数使用
5.1.3 getSegment() 函数
5.1.4 getPosTan() 函数
5.1.5 getMatrix() 函数
5.1.6 示例:支付宝支付成功动画

5.2 SVG 动画

5.2.1 概述
5.2.2 vector 标签与图像显示
5.2.3 动态 Vector
5.2.4 示例:输入搜索动画

第6章 Paint 基本使用

6.1 硬件加速

6.1.1 概述
6.1.2 软件绘制与硬件加速的区别
6.1.3 禁用 GPU 硬件加速的方法

6.2 文字

6.2.1 概述
6.2.2 绘图四格线与 FontMetrics
6.2.3 常用函数
6.2.4 示例:定点写字

6.3 Paint 常用函数

6.3.1 基本设置函数
6.3.2 字体相关函数

第7章 绘图进阶

7.1 贝济埃曲线

7.1.1 概述
7.1.2 贝济埃曲线之 quadTo
7.1.3 贝济埃曲线之 rQuadTo
7.1.4 示例:波浪效果

7.2 setShadowLayer 与阴影效果

7.2.1 构造函数
7.2.2 清除阴影
7.2.3 示例:给文字添加阴影

7.3 BlurMaskFilter 发光效果和图片阴影

7.3.1 概述
7.3.2 给图片添加纯色阴影
7.3.3 封装控件

7.4 Shader 与 BitmapShader

7.4.1 Shader 概述
7.4.2 BitmapShader 的基本用法
7.4.3 示例一:望远镜效果
7.4.4 示例二:生成不规则头像

7.5 Shader 之 LinearGradient

7.5.1 概述
7.5.2 示例:闪光文字效果

7.6 Shader 之 RadialGradient

7.6.1 双色渐变
7.6.2 多色渐变
7.6.3 TileMode 填充模式

第8章 混合模式

8.1 混合模式之 AvoidXfermode

8.1.1 混合模式概述
8.1.2 AvoidXfermode
8.1.3 AvoidXfermode 绘制原理
8.1.4 AvoidXfermode 之 Mode.AVOID

8.2 混合模式之 PorterDuffXfermode

8.2.1 PorterDuffXfermode 概述
8.2.2 颜色叠加相关模式

8.3 PorterDuffXfermode 之源图像模式

8.3.1 Mode.SRC
8.3.2 Mode.SRC_IN
8.3.3 Mode.SRC_OUT
8.3.4 Mode.SRC_OVER
8.3.5 Mode.SRC_ATOP

8.4 目标图像模式与其他模式

8.4.1 目标图像模式
8.4.2 其他模式——Mode.CLEAR
8.4.3 模式总结

第9章 Canvas 与图层

9.1 获取 Canvas 对象的方法

9.1.1 方法一:重写 onDraw()、dispatchDraw() 函数
9.1.2 方法二:使用 Bitmap 创建
9.1.3 方法三:调用 SurfaceHolder.lockCanvas() 函数

9.2 图层与画布

9.2.1 saveLayer() 函数
9.2.2 画布与图层
9.2.3 saveLayer() & saveLayerAlpha()

9.3 Flag 的具体含义 已过时

9.4 恢复画布

9.4.1 restoreToCount(int count)
9.4.2 restore() & restoreToCount(int count) 的关系

第10章 Android 画布

10.1 ShapeDrawable

10.1.1 shape 标签与 GradientDrawable
10.1.2 ShapDrawable 的构造函数
10.1.3 常用函数
10.1.4 自定义 Drawable
10.1.5 Drawable 与 Bitmap 对比

10.2 Bitmap

10.2.1 概述
10.2.2 创建 Bitmap 方法一:BitmapFactory
10.2.3 BitmapFactory.Options
10.2.4 创建 Bitmap 方法二:Bitmap 静态方法
10.2.5 常用函数
10.2.6 常见问题

10.3 SurfaceView

10.3.1 概述
10.3.2 基本用法
10.3.3 双缓冲技术

第11章 Matrix 与坐标变换

11.1 矩阵运算

11.1.1 矩阵的加法与减法
11.1.2 矩阵与数的乘法
11.1.3 矩阵与矩阵的乘法

11.2 ColorMatrix 色彩变换

11.2.1 色彩变换矩阵
11.2.2 色彩的几种运算方式
11.2.3 ColorMatrix 函数
11.2.4 ColorMatrix 相乘

第12章 封装控件

12.1 自定义属性与自定义 Style

12.1.1 示例
12.1.2 在 XML 中使用自定义的属性
12.1.3 在代码中获取自定义属性的值
12.1.4 declare-styleable 标签其他属性的用法

12.2 测量与布局

12.2.1 ViewGroup 绘制流程
12.2.2 onMeasure() 函数与 MeasureSpec
12.2.3 onLayout() 函数
12.2.4 获取子控件 margin 值的方法

12.3 实现 FlowLayout 容器

12.3.1 XML 布局
12.3.2 提取 margin 值与重写 onMeasure() 函数
12.3.3 完整代码

第13章 控件高级属性

13.1 GestureDetector 手势检测

13.1.1 概述
13.1.2 GestureDetector.OnGestureListener
13.1.3 GestureDetector.OnDoubleTapListener
13.1.4 GestureDetector.SimpleOnGestureListener
13.1.5 onFling() 函数的应用

13.2 Window 与 WindowManager

13.2.1 Window 与 WindowManager 的关系
13.2.2 示例:腾讯手机管家悬浮窗的小火箭效果