自定义控件代码:
package com.browser.testutils.widget; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * @author * @Description TODO 自定义组件实现换行 * @date 2015/11/27 */ public class DiCarQuestionTypeView extends ViewGroup { /** 水平方向内边距*/ private static int padding = 10;//水平方向padding /** 垂直方向内边距*/ private static int padding_vertical = 5; /** 距离父容器左右间距*/ private static int layout_margin = 30; /** 子控件间距*/ private static int margin = 20; /** * * 构造方法,通过new关键字创建当前对象 * * @version 1.0 * @createTime 2015-11-30,上午9:55:51 * @updateTime 2015-11-30,上午9:55:51 * @createAuthor * @updateAuthor * @updateInfo (此处输入修改内容,若无修改可不写.) * @param context */ public DiCarQuestionTypeView(Context context) { super(context); } public DiCarQuestionTypeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public DiCarQuestionTypeView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = getChildCount();//孩子个数 int autualWidth = r - l;//可用空间的宽度 int x = layout_margin;// 横坐标开始 int y = 0;//纵坐标开始 int rows = 1;//记录行数 for(int i = 0; i < childCount; i++){ View view = getChildAt(i); //view.setBackgroundColor(Color.GREEN); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); x += width + margin;//计算宽度 if(x > autualWidth){ x = width + layout_margin + margin;//重新设置当前行的宽度开始位置 rows++;//行数加一 } y = rows*(height + margin);//计算高度 view.layout(x - width - margin, y - height, x - 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 - layout_margin * 2;//实际宽度 int childCount = getChildCount(); for(int index = 0; index < childCount; index++){ View child = getChildAt(index); child.setPadding(padding, padding_vertical, padding, padding_vertical); child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); int width = child.getMeasuredWidth(); int height = child.getMeasuredHeight(); x += width + margin; if(x > actualWidth){//换行 x = width; rows++; } y = rows*(height + margin); } setMeasuredDimension(actualWidth, y); } /** * * 设置水平方向内边距 * @version 1.0 * @createTime 2015-11-30,上午9:52:32 * @updateTime 2015-11-30,上午9:52:32 * @createAuthor * @updateAuthor * @updateInfo (此处输入修改内容,若无修改可不写.) * @param padding */ public static void setPadding(int padding) { DiCarQuestionTypeView.padding = padding; } /** * 设置垂直方向内边距 * (此处输入方法执行任务.) * * @version 1.0 * @createTime 2015-11-30,上午9:53:15 * @updateTime 2015-11-30,上午9:53:15 * @createAuthor * @updateAuthor * @updateInfo (此处输入修改内容,若无修改可不写.) * @param padding_vertical */ public static void setPadding_vertical(int padding_vertical) { DiCarQuestionTypeView.padding_vertical = padding_vertical; } /** * 设置距离父容器左右间距 * (此处输入方法执行任务.) * * @version 1.0 * @createTime 2015-11-30,上午9:53:39 * @updateTime 2015-11-30,上午9:53:39 * @createAuthor * @updateAuthor * @updateInfo (此处输入修改内容,若无修改可不写.) * @param layout_margin */ public static void setLayout_margin(int layout_margin) { DiCarQuestionTypeView.layout_margin = layout_margin; } /** * 设置子控件间距 * (此处输入方法执行任务.) * * @version 1.0 * @createTime 2015-11-30,上午9:54:12 * @updateTime 2015-11-30,上午9:54:12 * @createAuthor * @updateAuthor * @updateInfo (此处输入修改内容,若无修改可不写.) * @param margin */ public static void setMargin(int margin) { DiCarQuestionTypeView.margin = margin; } }xml中使用代码:
<com.browser.testutils.widget.DiCarQuestionTypeView android:id="@+id/view_wordwrap" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" />
main使用:
private String[] strs = new String[] { "技术类型", "技术类型技术类型", "技术类技术类型型", "技类型", "技术类型", "技术技术类型技术类型类型", "型", "技术型", "技术", "技术型", "技类型", "技术类型技术类" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //initView(); wordWrapView = (DiCarQuestionTypeView) this.findViewById(R.id.view_wordwrap); for (int i = 0; i < 12; i++) { TextView textView = (TextView) View.inflate(this, R.layout.itme_txt_layout2, null); textView.setText(strs[i]); wordWrapView.addView(textView); } }
效果图:
同时有更新:
多种标签模式效果如下:
源码:http://download.youkuaiyun.com/detail/lu1024188315/9454844