Android自定义控件开发入门与实战
  • 推荐21
  • 收藏42
  • 浏览13.8K

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

读者评论

  • 362页计算显示屏幕大小的图片的大小的时候,算出的是3mb,但是下一句就变成了24mb,是怎么回事

    gyp发表于 2020/10/12 20:44:01
  • 第一章完整版64页,canvas根本就没有clipRegion方法,作者是怎么调用的?

    ht0xc3dg发表于 2020/9/29 11:34:22
  • 请问完整版怎么看呢

    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

相关图书

Android进阶之光(第2版)

刘望舒 (作者)

本书是一本Android进阶类图书,书中各知识点由浅入深、环环相扣,最终这些知识点形成了一个体系结构。本书共分为11章。第1章介绍从Android 5.0到An...

 

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