在Android中,官方提供的控件是非常有限的,而我们所面临的需求却是多样的。大家在工作中难免会接触到自定义控件的需求,但系统讲解自定义控件知识的书籍却少之又少。不仅因为自定义控件涉及的知识丰富、繁杂,而且与动画和色彩相关的知识很难在纸张上表现出来。
本书从自定义控件的动画、绘图、视图三方面入手,分别讲解与自定义控件相关的各种知识,给大家系统地梳理相关知识点,并且通过翔实的案例讲解每个知识点在现实工作中所能实现的功能。
从动画、绘图、视图三方面介绍Android自定义控件相关知识,配以翔实的案例讲解每个知识点,既适合系统学习,又可以用于查漏补缺。
前言
在我刚入门Android的时候,就被各种自定义控件所吸引,但当真正想要自己去制作时,由于涉及的知识太多,所以根本无从下手。而且我在搜索网页时也发现,与自定义控件相关的知识非常少,大都是一些例子的源码,讲解的内容非常有限。从那时起,我便想,如果我学会了自定义控件,就要写一系列博文,把相关的知识梳理清楚,供后来者参考。
从2015年起,我便着重积累这方面的知识。从2016年1月起,我基本保持每两周一篇博文的频率在CSDN上公开发表。在不知不觉间,我已经连续更新了二十几篇博文,得到了很多朋友的喜欢和赞扬。我当初更新博客的目的很简单,一方面,能够梳理知识点,以防自己忘记;另一方面,能为后来者做一点事,希望大家在学习自定义控件时,不必像我这样费劲。
后来,电子工业出版社的付睿编辑联系到我,想让我把与自定义控件相关的知识整理成书。刚开始我是犹豫的,因为纸质媒介很难表现出自定义控件所特有的动画和色彩。为此,电子工业出版社给予了我很大的支持,在官网上添加博客功能,方便我的动态图片上传到后台,进而将图片地址制作成二维码,供大家扫描观看。这一突破性的想法解决了我的后顾之忧。非常感谢他们的支持!
我在阿里巴巴工作的时候,在时间上是非常紧张的,从每天早上9点到晚上9点是正常的上下班时间。为了写书,我每天早上保证7点到公司,写到9点,然后再回工位上班;周末基本上也都在准备资料、写代码、写书中度过。这让我原本非常紧张的生活变得更加紧张。
然而我又是一个不安分的人,我于2017年4月从阿里巴巴辞职,跟朋友一起去创业。创业路上的艰辛是我所没有预见的,原本不多的时间被瓜分得更是少之又少,只能每天熬夜写作。
非常感谢我的妻子聂倩,在这两年里,基本上没有时间陪你,是你的宽容与支持才有了这本书的成稿。同时,也要感谢我的小公主雯雯,如果不是你的到来,我就不会体会到为人父的快乐,是你让我在工作中充满了力量。感谢灰灰,从创业开始就随我四处奔波,不离不弃。感谢博哥,在公司最困难的时候,选择留下来共渡难关。感谢你们在公司走上正轨后,为我承担了工作中大部分的责任,让我能安心地完成本书。
本书开篇主要讲解了入门自定义控件所需的一些必备知识;在动画篇中,详细讲解了在Android中制作动画的几种方法;在绘图篇中,具体讲解了与绘图相关的知识;在视图篇中,主要讲解了控件本身所涉及的一些知识。
在写作过程中,我尽量做到两点。第一,讲通、讲透。以我的理解,讲解出相关的知识所涉及的方方面面,力争让大家不再需要自己找资料,就可以全面理解这些知识。当然,本书中的有些内容在网上是找不到的,都是根据个人经验而得出的结论,难免有所偏失,如有不足,还望指正。第二,实例交织。我尽量在每个知识点中都加入一些实战中的例子,方便大家理解。
为了做到这两点,本书内容非常多,我把相对不重要的内容迁移到网上,大家可以到网上继续阅读。同时,本书的前后章节是经过严格推敲的,大家切勿跳章学习,必须按照顺序逐步进行。虽然我会给大家提供源码,但是请大家自己把代码敲一遍,因为只有动手写过的东西,才真正是自己的。
我在更新博客时,喜欢在每篇博文前加一句序言来激励自己。在本书中,我在每章前仍会加一句序言。本书第1章的序言是我非常喜欢的一句话,送给大家:迷茫,本就是青春该有的样子,但不要让未来的你讨厌现在的自己。
2,第39页,从底部向上数第三行的,ScaleAnimation构造函数中的0.5f和上面xml中的pivotX=“50”, pivotY=“50”不是对应的,0.5f对应的是50%而不是50
7,第54页底部二维码左侧的代码中,有三个tranlate中少了s,应该是translate
12,第99页二维码下面的一行中”(drawable/cirlce.xml)”中cirlce单词拼写错误,这个单词应该是圆circle;在底部的布局代码中也有一个错误,ImageView中android:src=”@drawable/cicle”一句中cicle拼写错误,应该是circle
new AlphaAnimation(1.0f,0.1f)应该换成(0.1f,1.0f)
18年10月第2次印刷的版次中,43页第2个代码块,最后tv.startAnimation(AnimationSet)应改为tv.startAnimation(setAnim).