一、继承ViewGroup需要做的
- 重写onMeasure()
不仅要完成自己的measure过程,还要完成子View的measure过程。 - 重写onLayout()
用来确定子View的位置。 - 重写generateLayoutParams()
当在LinearLayout中写childView的时候,可以写layout_gravity,layout_weight属性;在 RelativeLayout中的childView有layout_centerInParent属性,却没有 layout_gravity,layout_weight,这是为什么呢?这是因为每个ViewGroup需要指定一个LayoutParams,用于 确定支持childView支持哪些属性,比如LinearLayout指定LinearLayout.LayoutParams等。
二、View的3种测量模式
ViewGroup会为childView指定测量模式,下面简单介绍下三种测量模式:
- EXACTLY:表示设置了精确的值,一般当childView设置其宽、高为精确值、match_parent时,ViewGroup会将其设置为EXACTLY;
- AT_MOST:表示子布局被限制在一个最大值内,一般当childView设置其宽、高为wrap_content时,ViewGroup会将其设置为AT_MOST;
- UNSPECIFIED:表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、ScrollView的childView的heightMode中;此种模式比较少见。
三、自动换行Layout
需求:显示个人擅长项目
分析:
用LinearLayout、RelativeLayout动态添加TextView不能控制换行,用GridView不能达到显示效果。
拿来主义:https://github.com/hongyangAndroid/FlowLayout
使用鸿洋大神的FlowLayout( Android流式布局,支持单选、多选等,适合用于产品标签等),可以很轻松的实现上面的效果。
如果这样就完了,我就不用自己写了。
问题:
当一个标签字数较多,一行放不下的时候,使用FlowLayout时这个标签显示不完整。
这样的话,我就需要自己重写一个控件了,当然,站在巨人的肩膀上,实现的比较快。
对照着FlowLayout,实现了自己的AutoNewLineLayout,这里只用显示,不需要考虑单选、多选的问题,所以现在最主要的是解决上述问题。<