自动换行控件

公司一个需求,选择添加联系人,每个联系人的名字长短不一样,要求可以自动换行,当时的解决办法是自己继承了一个RelativeLayout(其实继承于那个布局是无所谓的),然后重写onLayout 和 onMeasure 方法

 

public class MyRelativeLayout extends RelativeLayout {
 int mLeft, mRight, mTop, mBottom, currentBottom;
 Hashtable<View, Position> map = new Hashtable<View, HiTalkRelativeLayout.Position>();
 public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 public MyRelativeLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 public MyRelativeLayout(Context context) {
  super(context);
 }
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  int count = getChildCount();
  for (int i = 0; i < count; i++) {
   View child = getChildAt(i);
   Position pos = map.get(child);
   if (pos != null) {
    child.layout(pos.left, pos.top, pos.right, pos.bottom);
   } else {
    Log.i("MyLayout", "error");
   }
  }
 }
 public int getPosition(int IndexInRow, int childIndex) {
  if (IndexInRow > 0) {
   return getPosition(IndexInRow - 1, childIndex - 1) + getChildAt(childIndex - 1).getMeasuredWidth() + 10;
  }
  return 0;
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int width = MeasureSpec.getSize(widthMeasureSpec);
  mLeft = 0;
  mRight = 0;
  mTop = 0;
  mBottom = 0;
  int j = 0;
  int count = getChildCount();
  for (int i = 0; i < count; i++) {
   Position position = new Position();
   View view = getChildAt(i);
   mLeft = getPosition(i - j, i);
   mRight = mLeft + view.getMeasuredWidth();
   if (mRight >= width) {
    j = i;
    mLeft = getPosition(i - j, i);
    mRight = mLeft + view.getMeasuredWidth();
    mTop += getChildAt(i).getMeasuredHeight() + 1;
   }
   mBottom = mTop + view.getMeasuredHeight();
   position.left = mLeft;
   position.top = mTop;
   position.right = mRight;
   position.bottom = mBottom;
   map.put(view, position);
  }
  setMeasuredDimension(width, mBottom);
 }
 private class Position {
  int left, top, right, bottom;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值