package net.greatsoft.main.view; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; public class AutoLinefeedLayout extends ViewGroup { int maxLineHight; public AutoLinefeedLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AutoLinefeedLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AutoLinefeedLayout(Context context) { this(context, null); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { layoutHorizontal(); } private void layoutHorizontal() { final int count = getChildCount(); final int lineWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); int paddingTop = getPaddingTop(); int childTop = 0; int childLeft = getPaddingLeft(); int availableLineWidth = lineWidth; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child == null) { continue; } else if (child.getVisibility() != GONE) { final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); if (availableLineWidth < childWidth) { availableLineWidth = lineWidth; paddingTop = paddingTop + maxLineHight; childLeft = getPaddingLeft(); maxLineHight = 0; } childTop = paddingTop; setChildFrame(child, childLeft, childTop, childWidth, childHeight); childLeft += childWidth; availableLineWidth = availableLineWidth - childWidth; maxLineHight = Math.max(maxLineHight, childHeight); } } } private void setChildFrame(View child, int left, int top, int width, int height) { child.layout(left, top, left + width, top + height); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int heightMode = MeasureSpec.getMode(heightMeasureSpec); int count = getChildCount(); for (int i = 0; i < count; i++) { measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); } if (heightMode == MeasureSpec.AT_MOST||heightMode == MeasureSpec.UNSPECIFIED) { final int width = MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( getDesiredHeight(width), MeasureSpec.EXACTLY)); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } private int getDesiredHeight(int width) { final int lineWidth = width - getPaddingLeft() - getPaddingRight(); int availableLineWidth = lineWidth; int totalHeight = getPaddingTop() + getPaddingBottom(); int lineHeight = 0; for (int i = 0; i < getChildCount(); i++) { final View child = getChildAt(i); if (child == null) { continue; } else if (child.getVisibility() == GONE) { continue; } final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); if (availableLineWidth < childWidth) { availableLineWidth = lineWidth; totalHeight = totalHeight + lineHeight; lineHeight = 0; } availableLineWidth = availableLineWidth - childWidth; lineHeight = Math.max(childHeight, lineHeight); } totalHeight = totalHeight+lineHeight; return totalHeight; } }
從網上找到了個流佈局, 可是在Dialog的使用中, 若是有控件設置了隱藏的話, 就略顯不足,原本使用了GridLayout 使用起來太麻煩,有時候由於機器的sdk 不一樣還會展現出不一樣的效果。因此仍是使用這個吧。主要緣由就是在高度的計算問題上。android