二话不说,先上图,如果是你们苦苦寻找的效果,请接着往下看。
绝对干货,直接上代码,直接讲用法,不讲原理,不讲思路,不绕弯弯,就是这么实在!就是喜欢你们复制粘贴!
想要知道如何实现的,代码里面的注释写得很详细,逻辑和算法都不是很复杂,看一会儿就能明白。
/**
* Created by asus on 2016/12/21.
* 自定义流式布局
*/
public class FlowLayout extends ViewGroup {
private ArrayList<Line> lineList = new ArrayList<>();
/**
* childVIew之间的水平间隔
*/
private int childViewHorizontalPadding = 0;
/**
* childView之间的垂直间隔
*/
private int childViewVerticalPadding = 0;
public FlowLayout(Context context) {
super(context);
}
public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 很多情况下onMeasure方法都会被执行,要确保集合为空,才不会影响以下代码的执行结果。
lineList.clear();
// 获取flowLayout的宽度,并且去掉padding
int width = MeasureSpec.getSize(widthMeasureSpec);
int contentWidth = width - getPaddingLeft() - getPaddingRight();
// 遍历flowLayout的子控件,创建line的实例
Line line = new Line();
for (int i = 0; i < getChildCount(); i++) {
View childView = getChildAt(i);
childView.measure(0, 0);// 确保能得到控件的宽高
// 如果Line为空,则直接添加,保证每行至少有一个view
if (line.getList().size() == 0) {
line.addLineView(childView);
} else if (line.getWidth() + childViewHorizontalPadding
+ childView.getMeasuredWidth() > conte