项目一:流式布局实战
使用技术:
自定义View/ViewGroup,递归算法
责任描述:
项目的全部开发
技术点描述:
- ①
onMeasure
方法会调用多次。
自定义ViewGroup
中,onMeasure
方法和onLayout
方法必须重写。且onMeasure
方法会调用多次,因此有些变量需要在onMeasure
方法的开始就进行一些清空操作(为了避免内存抖动,不要new
,而是clear
) - ②
onMeasure
方法由父控件调用。
当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure
方法。onMeasure
方法的两个参数就是父控件告诉子控件可获得的空间以及关于这个空间的约束条件,子控件拿着这些条件就能正确的测量自身的宽高了。 - ③
MeasureSpec
的作用。
MeasureSpec
代表一个32位的int
值,高2位代表SpecMode
,低30位代表SpecSize
。 - ④最后一行特殊处理
在流式布局中,最后一行要进行单独处理。否则最后一行可能因为长度不满一行应有长度而被舍弃。 - ⑤如果某子
View
被隐藏了,则无需测量。测量的都是没被隐藏的 - ⑥自身真正的的宽度和高度(
setMeasuredDimension
方法)
控件自身真正的的宽度和高度并不一定是测量后得到的宽度和高度,如果父控件给自己的Mode
是Exactly
,那么就直接用父亲给我的Size
,除此之外都用自己测量后得到的Size
此项目通过自定义流式布局实战,帮助我理解自定义ViewGroup
的递归测量,以及MeasureSpec
的含义。
难点:
①onMeasure
,onLayout
,onDraw
调用的顺序(平级上)
②onMeasure
的递归调用,setMeasureDimision
③onMeasure
的两个参数的应用规则
④如何处理换行的逻辑
⑤最后一行的处理
项目二:游动的锦鲤
画锦鲤完成后,将步骤和知识点整理成的博客,还有源代码
游锦鲤完成后,将步骤和知识点整理成的博客,还有源代码
使用技术:
自定义View,动画,数学知识,贝塞尔曲线
责任描述:
项目的全部开发
技术描述:
将此项目划分为两部分,第一部分是将锦鲤画出来,第二部分是让锦鲤游起来
-
1.第一部分
第一部分相对简单,有如下一些技术点需要注意
①求坐标算法
在此部分中,求坐标算法几乎贯穿始终。其数学原理是三角函数的知识。有一个细节,就是安卓中的坐标系和数学中的坐标系正好相反,用-180
来体现这个相反。
②求各个点的坐标
各个点的坐标其实是根据现有的比例来确定的。只要有了①的算法,求坐标并不难。尤其是注意中间有很多度数的加减。其代表的是顺着x轴顺时针还是逆时针才能到达目标点。顺时针就是负的,逆时针就是正的
③二阶贝塞尔曲线 -
2.第二部分
第二部分就比较难理解了,尤其是运用到了很多数学知识
①鱼身和鱼节肢摆动频率控制
利用三角函数的周期,使用一个属性动画,即可实现鱼身和鱼节肢摆动频率的不同。
②两个鱼节肢的开始时间不应相同
利用cos
和sin
的区别,实现两个鱼节肢摆动频率相同,但是开始摆动的时间不同
③ObjectAnimator
实现水波纹
④核心算法求两线夹角(余弦定理)
余弦定理不算难的,妙点在于利用tan
来判断鱼将要游动的方向,以及AOB
角取反,来求得控制点2的坐标。
⑤始终以图片控件的左上角为鱼游动的参考点
⑥利用PathMeasure
使鱼头跟着路径转
此项目通过自定义View
与属性动画的配合,结合大量数学知识,实现了一个锦鲤游动的效果。不仅帮助我提高了对自定义View
的理解程度以及动画的使用能力,还通过数学知识,提高了我的思维能力。
难点:
①参考大小和坐标:从网上找的现成的比例。坐标是反的,有时候需要-180
②各种数学知识,比如鱼身和鱼节肢摆动频率不应相同,开始摆动的时间也不应相同,这些都用到了三角函数的周期
③余弦定理求两线夹角,并且通过tan来判断鱼游动的方向
项目三:RecyclerView自动吸顶项目实战
使用技术:
RecyclerView
进阶使用、自定义ItemDecoration
、ItemDecoration
中onDrawOver
和onDraw
方法的区别、取消冗余绘制、算法思想
责任描述:
项目的全部开发
技术描述:
- ①自定义
ItemDecoration
。
尤其是onDraw
和onDrawOver
方法的区分使用。可以理解为一个是用在动上,一个是用在静上。 - ②利用
onDrawOver
实现吸顶时的组名更换。
即判断当前组的下一个组是不是新组,以此为依据分别进行draw
- ③冗余绘制的处理
通过添加绘制条件,去掉多余组名分割线的绘制;解决组名瞬间改变而非“顶”上去;使用clipRect
使字只能在固定区域内进行绘制
此项目覆盖了RecyclerView
的基本使用,以及使用自定义ItemDecoration
绘制分割线和组名,以及使用onDraw
和onDrawOver
实现自动吸顶效果等知识点,还进行了去掉冗余绘制的优化,还有大量的算法。
难点:
①onDraw
和onDrawOver
的区别,和选择。通过outRect
预留出更大的空间
②如何保持一直在顶部:onDrawOver
,如何保证组名的变换:判断下一个是不是组名,如果是的话,随时改变bottom
,进行绘制
③加上paddingTop
的时候,分割线和组名变换异常。解决方案:将原来绘制的坐标,把paddingTop
考虑进去就行了
④如果paddingTop
是黑色的,会发现文字也在过度绘制,所以用个clipRect
就行了