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中使用

<com.xxxx.view.AutoLinefeedLayout
    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);


作者:

薄荷记账     优秀源码探索者     简洁   稳定   优雅   无限可能!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值