‍昨天打开日历,惊奇的发现七夕到了,在这样的日子,我首先想到的就是广大关注我的同胞们,于是我开始思考以什么样的方式来祝大家节日快乐呢?

于是我找到我的御用绘图师,出巨额价格向她提了一个需求:

  • 绘制一副唯美的Android机器人版本的牛郎织女~~

当然了,提需求当然要给原型图,于是我发出洪荒之力,画出了下图:

感觉还不错哟,就是有点单调。还加点什么呢?对了,喜鹊,来一群Android喜鹊机器人飞来飞去也不错,于是我又动起笔来,画了只可爱的喜鹊:

好了,完工,感觉萌萌哒。

剩下的就看绘图师给的实际上线效果图了。

哈哈,不错吧,这张图就是献给大家的礼物~~在此也感谢我的朋友长期为我绘制封面图~

熬夜懵逼的分割线

对了,还有干货,不是人人都能接受几张图敷衍了事的~~

恩,因为很多同学问我,自定义View如何学习,感觉自己无从下手,我就给大家讲讲怎么去学习自定义View吧:

其实现在这个时期,自定义的学习资料非常多,而且也不算什么太晦涩难懂的知识了。

为了便于理解,在学习过程中,把自定义View和自定义ViewGroup可以分开来进行学习。

接下来我要用你来问,我来答的方式,给大家简单描述下,如何去学习自定义View:

如何区分自定义View还是自定义ViewGroup?

对你需要制作的效果进行分析,如果你需要制作的控件类似于一个容器,内部有很多独立的单元,甚至这些单元还可以和用户交互,比如点击,拖拽交换等,那么较好的选择是自定义ViewGroup;如果你的控件仅仅对自身的绘制,比如一个好看的进度条之类的,那么较好的选择是自定义View。

恩,你可能会迷惑为什么要区分呢,有个同学这么问过我:

自定义View和ViewGroup侧重点不同吗?

二者的侧重点是不同的,自定义View主要考察的是测量(onMeasure)、和绘制(onDraw),也就是说你只要会确定View的大小,剩下的就是考虑如何通过canvas等API去绘制了;而自定义ViewGroup大多时候,考察的是对子View的布局(onLayout)和与用户去交互,各种滑动特效(事件分发相关方法)呀什么的。

我也知道侧重点不同,但是我就是不会哇...恩,看看别人的问题:

自定义View的测量和绘制分别如何学习?

对于测量,其实最主要就是对实际使用场景的把握,并非所有的测量都需要去支持3种模式的,有些控件可能只有在固定宽高的情况下才能够正常工作,比如一个圆形进度条,必须要一个决定半径的值,所以你可能只需要根据半径去设置宽高就可以了,不需要想太多;对于绘制,这里涉及到的API比较多,主要还是取决于你的效果,起码掌握的就是绘制各种图形、绘制文字、熟练canvas.translate、rotate这类方法,在这个基础上再去了解shader、path、xfermode等比较神奇的API。

某个效果绘制不出来不代表你不会自定义View,只要你熟知流程,能够很好的把握测量,能够绘制一个圆圈,也能说你会自定义View了。所以很多时候,你不是不会自定View,而是你可能不太熟悉知识的组合或者某个API没有了解过,无法绘制出别人那种炫酷的效果而已。

自定义ViewGroup如何学习呢?

自定义ViewGroup的侧重点,主要是对子View布局,比如你做个类似建行的圆形菜单,什么卫星菜单,如果是禁止的,其实考察的就是你的布局能力,所谓布局就是把View放到一个指定的坐标上,一般onLayout都不复杂,只要你找到规律;真正的难点在于交互,很多时候ViewGroup都包含跟用户的交互,比如下拉、滑动等,此时你应该对事件分发机制非常了解,了解什么时候拦截,该不该拦截,如何捕获事件,捕获到了怎么处理等。

所以想学好自定义ViewGroup,最起码要先了解事件分发机制。

onInterceptTouchEvent我一直没有办法好好把握,怎么办?

这个你问对人了,我还真有个非常好的办法,打开ScrollView的源码,根据ScrollView的特性,去观察它的写法,想想它为什么这么做,把它的处理方式临摹下来。

其实学习系统提供的控件是非常好的学习方式,你最起码可以知道一些可靠性比较高的处理方式,比如什么时候拦截,多少距离算触发滚动等。

除了掌握以上,还有什么你觉得是应该掌握的?对自定义View有帮助的...

有的,系统提供了非常多的辅助类,如果你用好的话,可以极大的帮助你完成自定义View的伟业,例如:ViewConfiguration可以拿到很多你需要的常量;VelocityTracker帮助你完成速度检测;GestureDetector帮助你完成各种用户手势的识别;Scroller、OverScroller帮助你完成持续的滑动效果;ViewDragHelper帮助你更好的实现各种拖拽效果。

对于系统提供的这些辅助类,原则上一定要好好理解,更可能的去使用它们,可以帮助你更好的掌握自定义ViewGroup。

还有什么要补充的么?

还有个机制很有意思,5.x有个NestedScrolling机制,这个机制可以帮助我们很好的完成嵌套滑动,比如CoordinatorLayout给我们实现了很多神奇的效果,内部的机制部分就是依赖于它;所以有可能的话,可以去研究下NestedScrolling机制,它甚至可以完成一些事件分发机制难以完成的效果,例如下拉刷新的头部的连续滚动(拉出头部,然后向上隐藏,List列表还能连续滑动不中断),有时间一定要学习下。

NestedScrolling的确很神奇,不过网上也有很多资料了,灵活的使用,可以帮助你减少嵌套滑动的非常多的代码,而且还有一定的解耦能力。

好了,关于自定义View的问答就结束了~~

以上纯属个人自编自导自演,因本人能力有限,如果对你有帮助,非常荣幸;如果没有,那也有一丝的遗憾,毕竟我写了这么久。不过语言的表达很多时候就会有一些歧义,所以千万不要跟我抠字眼~~

最后希望大家结合上述的问答,找到学习的要点,然后收集资料,针对性的学习,恩,如果有时间,我也会录制一套自定义View的视频的~~

等等,我还有话说,今天这文章我觉得应该打赏一波~~

没问题~

好了,在这样的节日,仅以以上这些图片和问答向大家表示感谢,也为自己的坚持点赞,图片如果喜欢欢迎自由转载;如果条件允许,鸿洋会在每个节日都会以Android机器人为主角来作图,来调节下气氛,当然有可能也会附属上一些有用的问答送给大家~