首页 > 系统 > Android > 正文

Android自定义组件之自动换行View

2019-11-06 09:53:33
字体:
来源:转载
供稿:网友

from:http://www.tuicool.com/articles/u2eEbe

做Android这么长时间,对自定义组件这块知识了解的很少。之前公司项目里有个模块需求是自动换行,今天重新写个组件实现这个效果。

      效果图如下:

组件是继承的ViewGroup,在用的时候调用addView方法把TextView加进去,然后该组件会把textview放到合适的位置。

WordWrapView.java

public class WordWrapView extends ViewGroup {	PRivate static final int PADDING_HOR = 10;//水平方向padding	private static final int PADDING_VERTICAL = 5;//垂直方向padding	private static final int SIDE_MARGIN = 10;//左右间距	private static final int TEXT_MARGIN = 10;	/**	 * @param context	 */	public WordWrapView(Context context) {		super(context);	}		/**	 * @param context	 * @param attrs	 * @param defStyle	 */	public WordWrapView(Context context, AttributeSet attrs, int defStyle) {		super(context, attrs, defStyle);	}	/**	 * @param context	 * @param attrs	 */	public WordWrapView(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 = SIDE_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+TEXT_MARGIN;			if(x>autualWidth){				x = width+SIDE_MARGIN;				rows++;			}			y = rows*(height+TEXT_MARGIN);			if(i==0){				view.layout(x-width-TEXT_MARGIN, y-height, x-TEXT_MARGIN, y);			}else{				view.layout(x-width, y-height, x, 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);	}}View Code

MainActivity.java

public class MainActivity extends Activity {	private WordWrapView wordWrapView;	private String[] strs = new String[] { "哲学系", "新疆维吾尔族自治区", "新闻学", "心理学",			"犯罪心理学", "明明白白", "西方文学史", "计算机", "掌声", "心太软", "生命",			"程序开发" };	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		wordWrapView = (WordWrapView) this.findViewById(R.id.view_wordwrap);		for (int i = 0; i < 12; i++) {			TextView textview = new TextView(this);			textview.setText(strs[i]);			wordWrapView.addView(textview);		}	}}View Code

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"	xmlns:tools="http://schemas.android.com/tools"	android:layout_width="match_parent"	android:layout_height="match_parent"	tools:context=".MainActivity" >	<com.winhoo.viewtest.widget.WordWrapView		android:id="@+id/view_wordwrap"		android:layout_width="wrap_content"		android:layout_height="wrap_content"		android:layout_centerHorizontal="true"		/></RelativeLayout>activity_main.xml
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表