先看下效果图
1、流式布局实现
继承ViewGroup,重写onMeasure,onLayout方法。代码如下:
package com.example.lin.flowlayoutdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* Created by lin.zhou on 2015/8/12.
* 流式布局
*/
public class YhFlowLayout extends ViewGroup {
private List<Line> mLines = new ArrayList<Line>(); // 用来记录描述有多少行View
private Line mCurrrenLine; // 用来记录当前已经添加到了哪一行
private int mHorizontalSpace = 10;
private int mVerticalSpace = 6;
public YhFlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public YhFlowLayout(Context context) {
super(context);
}
public void setSpace(int horizontalSpace, int verticalSpace) {
this.mHorizontalSpace = horizontalSpace;
this.mVerticalSpace = verticalSpace;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//清空
mLines.clear();
mCurrrenLine = null;
int layoutWidth = MeasureSpec.getSize(widthMeasureSpec);
// 获取行最大的宽度
int maxLineWidth = layoutWidth - getPaddingLeft() - getPaddingRight();
//测量孩子
int count = getChildCount();
for (int i = 0; i < count; i++) {
View v = getChildAt(i);
//如果孩子不可见
if (v.getVisibility() == GONE) {
continue;
}
measureChild(v, widthMeasureSpec, heightMeasureSpec);
// 往lines添加孩子
if (mCurrrenLine == null) {
// 说明还没有开始添加孩子
mCurrrenLine = new Line(maxLineWidth, mHorizontalSpace);
// 添加到 Lines中
mLines.add(mCurrrenLine);
// 行中一个孩子都没有
mCurrrenLine.addView(v);
} else {
// 行中有孩子了
Boolean canAdd = mCurrrenLine.canAdd(v);
if