1、CMYCMMYCYCMYKAndroid自定控件开入与fy.pdf 1 2018/6/22 15:00:01 内 容 简 介 在 Android 中,官方提供的控件是非常有限的,而我们所面临的需求却是多样的。大家在工作中难免会接触到自定义控件的需求,但系统讲解自定义控件知识的书籍却少之又少。这不仅因为自定义控件涉及的知识丰富、繁杂,而且与动画和色彩相关的知识很难在纸张上表现出来。本书从自定义控件的动画、绘图、视图三方面入手,分别讲解与自定义控件相关的各种知识,给大家系统地梳理相关知识点,并且通过翔实的案例讲解每个知识点在现实工作中所能实现的功能。本书不仅适合 Android 初、中级水平从业者
2、学习,也适合高水平从业者查漏补缺使用,还可以作为高校 Android 自定义控件方面的入门级教材。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(CIP)数据 Android 自定义控件开发入门与实战/启舰著.北京:电子工业出版社,2018.7 ISBN 978-7-121-34556-2.A.启.移动终端应用程序程序设计.TN929.53 中国版本图书馆 CIP 数据核字(2018)第 135168 号 策划编辑:付 睿 责任编辑:牛 勇 特约编辑:赵树刚 印 刷:三河市良远印务有限公司 装 订:三河市良远印务有限公司 出版发行:电子工业出版社 北京
3、市海淀区万寿路 173 信箱 邮编:100036 开 本:7871092 1/16 印张:31.5 字数:806.4 千字 版 次:2018 年 7 月第 1 版 印 次:2018 年 7 月第 1 次印刷 定 价:99.00 元 凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。质量投诉请发邮件至 ,盗版侵权举报请发邮件到 。本书咨询联系方式:010-51260888-819,。前 言 在我刚入门 Android 的时候,就被各种自定义控件所吸引,但当真正想要自己去制作时,由于涉及的知识太多,
4、所以根本无从下手。而且我在搜索网页时也发现,与自定义控件相关的知识非常少,大都是一些例子的源码,讲解的内容非常有限。从那时起,我便想,如果我学会了自定义控件,就要写一系列博文,把相关的知识梳理清楚,供后来者参考。从 2015 年起,我便着重积累这方面的知识。从 2016 年 1 月起,我基本保持每两周一篇博文的频率在 CSDN 上公开发表。在不知不觉间,我已经连续更新了二十几篇博文,得到了很多朋友的喜欢和赞扬。我当初更新博客的目的很简单,一方面,能够梳理知识点,以防自己忘记;另一方面,能为后来者做一点事,希望大家在学习自定义控件时,不必像我这样费劲。后来,电子工业出版社的付睿编辑联系到我,想让
5、我把与自定义控件相关的知识整理成书。刚开始我是犹豫的,因为纸质媒介很难表现出自定义控件所特有的动画和色彩。为此,电子工业出版社给予了我很大的支持,在官网上添加博客功能,方便我的动态图片上传到后台,进而将图片地址制作成二维码,供大家扫描观看。这一突破性的想法解决了我的后顾之忧。非常感谢他们的支持!我在阿里巴巴工作的时候,在时间上是非常紧张的,从每天早上 9 点到晚上 9 点是正常的上下班时间。为了写书,我每天早上保证 7 点到公司,写到 9 点,然后再回工位上班;周末基本上也都在准备资料、写代码、写书中度过。这让我原本非常紧张的生活变得更加紧张。然而我又是一个不安分的人,我于 2017 年 4
6、月从阿里巴巴辞职,跟朋友一起去创业。创业路上的艰辛是我所没有预见的,原本不多的时间被瓜分得更是少之又少,只能每天熬夜写作。非常感谢我的妻子聂倩,在这两年里,基本上没有时间陪你,是你的宽容与支持才有了这本书的成稿。同时,也要感谢我的小公主雯雯,如果不是你的到来,我就不会体会到为人父的快乐,是你让我在工作中充满了力量。感谢灰灰,从创业开始就随我四处奔波,不离不弃。感谢博哥,在公司最困难的时候,选择留下来共渡难关。感谢你们在公司走上正轨后,为我承担了工作中大部分的责任,让我能安心地完成本书。本书开篇主要讲解了入门自定义控件所需的一些必备知识;在动画篇中,详细讲解了在Android 中制作动画的几种方
7、法;在绘图篇中,具体讲解了与绘图相关的知识;在视图篇中,Android 自定义控件开发入门与实战 IV 主要讲解了控件本身所涉及的一些知识。在写作过程中,我尽量做到两点。第一,讲通、讲透。以我的理解,讲解出相关的知识所涉及的方方面面,力争让大家不再需要自己找资料,就可以全面理解这些知识。当然,本书中的有些内容在网上是找不到的,都是根据个人经验而得出的结论,难免有所偏失,如有不足,还望指正。第二,实例交织。我尽量在每个知识点中都加入一些实战中的例子,方便大家理解。为了做到这两点,本书内容非常多,我把相对不重要的内容迁移到网上,大家可以到网上继续阅读。同时,本书的前后章节是经过严格推敲的,大家切勿
8、跳章学习,必须按照顺序逐步进行。虽然我会给大家提供源码,但是请大家自己把代码敲一遍,因为只有动手写过的东西,才真正是自己的。我在更新博客时,喜欢在每篇博文前加一句序言来激励自己。在本书中,我在每章前仍会加一句序言。本书第 1 章的序言是我非常喜欢的一句话,送给大家:迷茫,本就是青春该有的样子,但不要让未来的你讨厌现在的自己。轻松注册成为博文视点社区用户(),扫码直达本书页面。下载资源:本书如提供示例代码及资源文件,均可在 下载资源 处下载。提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。交流互动:在页面下方
9、读者评论 处留下您的疑问或观点,与我们和其他读者一同学习交流。页面入口:http:/ 目 录 开 篇 第 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
10、 章 视图动画.26 2.1 视图动画标签.26 2.1.1 概述.26 2.1.2 scale 标签.28 Android 自定义控件开发入门与实战 VI 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 AnimationS
11、et.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
12、.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 目录 VII 3.1.4 示例:弹跳加载中效果.83 3.2 自定义插值器与 Evaluator.86 3.2.1 自定义插值器.87 3.2.
13、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 Anima
14、torSet.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
15、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 Android 自定义控件开发入门与实战 VIII 4.3.2 LayoutTransition.157 4.3.3 其他函数.161 4.4 开源动画库 NineOldAndroids.163 4.4.1 NineOldAndroids 中的 ViewPropertyAnimator.1
16、64 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 P