public class AutoTextViewLayout extends ViewGroup { private static final int PADDING_HOR = 10;//水平方向padding private static final int PADDING_VERTICAL = 5;//垂直方向padding private static final int SIDE_MARGIN = 0;//左右间距,此处如果父布局已经存在margin,就为0. private static final int TEXT_MARGIN = 10; public AutoTextViewLayout(Context context) { super(context); } public AutoTextViewLayout(Context context, AttributeSet attrs) { super(context, attrs); } public AutoTextViewLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = getChildCount(); int actualWidth = r - 1; int x = SIDE_MARGIN;//x 起点 int y = 0; //Y 起点 int rows = 1;// 行计数 for (int i = 0; i < childCount; i++) { View view = getChildAt(i); view.setBackgroundResource(R.drawable.tag_bg); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); x += width + TEXT_MARGIN; if (x > actualWidth) { x = width + TEXT_MARGIN; rows++; } y = rows * (height + TEXT_MARGIN); view.layout(x - width - TEXT_MARGIN, y - height, x - TEXT_MARGIN, y); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int x = 0; int y = 0; int rows = 1; int specWidth = MeasureSpec.getSize(widthMeasureSpec); int actualWidth = specWidth - SIDE_MARGIN * 2; int childCount = getChildCount(); for (int index = 0; index < childCount; index++) { View child = getChildAt(index); child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR, PADDING_VERTICAL); child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); int width = child.getMeasuredWidth(); int height = child.getMeasuredHeight(); x += width + TEXT_MARGIN; if (x > actualWidth) { x = width; rows++; } y = rows * (height + TEXT_MARGIN); } setMeasuredDimension(actualWidth, y); } }
标签自动换行
最新推荐文章于 2024-07-12 23:25:33 发布