Android自动换行布局之AutoLinefeedLayout
直接上代码,
创建AutoLinefeedLayout.java
import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * 自动换行布局 * @author zhao_pc */ public class AutoLinefeedLayout extends ViewGroup {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; int maxLineHight = 0; 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++) {View child = getChildAt(i); 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; }}
使用方法:
xml中使用
android:id="@+id/linearlayout_post"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
java添加子布局
避免在listview中布局重复问题,addview之前需调用
autolinefeedlayout.removeAllViews();
LayoutInflater inflater = LayoutInflater.from(this); LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.xxx, null);
autolinefeedlayout.addView(ll);
作者:
薄荷记账 优秀源码探索者 简洁 稳定 优雅 无限可能!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
