项目一:流式布局实战
使用技术:
自定义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就行了
本文详细介绍了三个Android开发项目:自定义流式布局、游动的锦鲤动画以及RecyclerView自动吸顶功能。在流式布局中,探讨了自定义ViewGroup的递归测量、MeasureSpec的使用和最后一行处理。锦鲤动画项目通过自定义View和属性动画,结合数学知识实现了逼真的游动效果。最后,针对RecyclerView,讲解了自定义ItemDecoration来实现自动吸顶,同时解决了冗余绘制问题。这些项目加深了对自定义视图、动画和高级布局机制的理解。
26

被折叠的 条评论
为什么被折叠?



