public class MyFlow extends ViewGroup { public MyFlow(Context context) { super(context); } public MyFlow(Context context, AttributeSet attrs) { this(context, attrs,0); } public MyFlow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //测量所有孩子的宽高 measureChildren(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec);//AT-MOST int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width = 0; int height = 0; int lineWidth = 0; //int lineHeight = 0; int totalHeight = 0;//累加的高度 View childView; int childWidth = 0; int childHeight = 0; for (int i = 0; i < getChildCount(); i++) { childView = getChildAt(i); childWidth = childView.getMeasuredWidth(); childHeight = childView.getMeasuredHeight(); // if (childWidth > widthSize) { //Log.d(TAG, "onMeasure: 太大了"); } //测量布局的宽 //换行/不换行 if (childWidth + lineWidth > widthSize) { //换行 width = widthSize; totalHeight += childHeight; //第一个 //lineHeight = childHeight; lineWidth = childWidth; } else { //不换行 lineWidth += childWidth; //lineHeight = Math.max(lineHeight, childHeight); width = Math.max(width, lineWidth); } //测量高度 if (i == getChildCount() - 1) { totalHeight += childHeight; height = totalHeight; } } width = widthMode == MeasureSpec.EXACTLY ? widthSize : width; height = heightMode == MeasureSpec.EXACTLY ? heightSize : height; setMeasuredDimension(widthSize, heightSize); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int lineWidth = 0; //int lineHeight = 0; int totalHeight = 0;//累加的高度 View childView; int childWidth = 0; int childHeight = 0; for (int i = 0; i < getChildCount(); i++) { childView = getChildAt(i); childWidth = childView.getMeasuredWidth(); childHeight = childView.getMeasuredHeight(); //测量布局的宽 //换行/不换行 if (childWidth + lineWidth > getMeasuredWidth()) { //换行 totalHeight += childHeight; lineWidth = 0; childViewLayout(childView, lineWidth, totalHeight, lineWidth + childWidth, totalHeight + childHeight); //第一个 //lineHeight = childHeight; lineWidth = childWidth; } else { //不换行 childViewLayout(childView, lineWidth, totalHeight, lineWidth + childWidth, totalHeight + childHeight); lineWidth += childWidth; //lineHeight = Math.max(lineHeight, childHeight); } } } public void childViewLayout(View childView, int l, int t, int r, int b) { childView.layout(l, t, r, b); } }