Android Flowlayout实现的说明

来源:互联网 发布:ios app 访问数据库 编辑:程序博客网 时间:2024/06/07 10:08

写过很多自定义控件,不说我自己也忘,有些还是蛮有用的,现在就来说个FlowLayout的实现,很久很久以前项目里用过,代码在我的github上

项目在:Android FlowLayout

绘制FlowLayout,考虑它是个布局,所以它的父类是ViewGroup大体思路就是先计算onMesure:1先得到自己的width和Height2然后遍历子节点(不可见的子view除外),遍历孩子节点就是计算每一行的宽度,如果没有达到边界值继续叠加,同时高度取同一行的子节点的最大高度。如果达到最大边界值就换行,高度叠加。在这个遍历过程中有个容器我把它定义List<List<View>>,这个list里面的每一个item也是一个容器,用来记录每一行有多少个View。在计算里有个一地方特别要题 一下:

int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);//取低16位值int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);int modeWidth = MeasureSpec.getMode(widthMeasureSpec);int modeHeight = MeasureSpec.getMode(heightMeasureSpec);//取高16位值

这里的widthMeasureSpec和heightMeasureSpec都是整型的,int型在android里面占4位,32个字节,那那么widthMeasureSpec的高16位是表示Mode

Mode 有三种类型 EXACTLY:表示确定大小,如fill_parent,高度和宽带已经设置为一个固定的值。

                             AT_MOST:表示有个最大值, 如childView设置其宽、高为wrap_content时,ViewGroup会将其设置为AT_MOST;

                            MeasureSpec.UNSPECIFIED:不确定

那么低16位就是表示size了。

注意对于RootView也就是XML里面的第一个元素,它的Mode一般都为MeasureSpec.EXACTLY ,而size分别对应屏幕宽,高。其余子元素就根据自己在xml定义的属性  android:layout_width和android:layout_height,这两个里面的值来决定

onMeasure计算完了就到onLayout,在这个方法里遍历onMeasure里面产生的记录每一行有多少元素的容器,一个一个的给子View计算出合理的位置,当然每完成一行,每一行的起止位置在X轴方向要归0,Y轴方向就是高度上面要有个叠加

大概思路就是这样了

0 0