Android自定义组件之自动换行ViewGroup
2017-04-03 16:56
141 查看
import android.content.res.TypedArray; import android.view.ViewGroup; import android.view.View; import android.util.AttributeSet; import android.content.Context; import com.yl.gzyg.R; /** * @author Gavin */ public class ZWrapLayout extends ViewGroup { private int INNER_H_MARGIN = 10; //子控件的水平间距 private int INNER_V_MARGIN = 10; //子控件的垂直间距 /** * @param context: */ public ZWrapLayout(Context context) { super(context); } /** * @param context: * @param attrs: */ public ZWrapLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ZWrapLayout); INNER_H_MARGIN=a.getDimensionPixelSize(R.styleable.ZWrapLayout_inner_h_margin, 10); INNER_V_MARGIN=a.getDimensionPixelSize(R.styleable.ZWrapLayout_inner_v_margin, 10); a.recycle(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = getChildCount(); int maxWidth = r - l; //最大宽度 int x = getPaddingLeft(); //横坐标 int y = getPaddingTop(); //纵坐标 int rowHeight = 0; //行高 for(int i=0;i<childCount;i++){ View view = getChildAt(i); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); if(x+width>maxWidth-getPaddingRight()){//需要换行 y = y+rowHeight+INNER_V_MARGIN; x = getPaddingRight(); rowHeight = height; }else{ if(rowHeight<height) { rowHeight=height; } } view.layout(x, y, x+width, y+height); x = x+width+INNER_H_MARGIN; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int childCount = getChildCount(); int maxWidth = MeasureSpec.getSize(widthMeasureSpec);//最大宽度 int x = getPaddingLeft(); //横坐标 int y = getPaddingTop(); //纵坐标 int rowHeight = 0; //行高 for(int i=0;i<childCount;i++){ View view = getChildAt(i); int w = View.MeasureSpec.makeMeasureSpec(maxWidth-getPaddingLeft()-getPaddingRight(), View.MeasureSpec.AT_MOST); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 4000 view.measure(w, h); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); if(x+width>maxWidth-getPaddingRight()){//需要换行 y = y+rowHeight+INNER_V_MARGIN; x = getPaddingLeft(); rowHeight = height; }else{ if(rowHeight<height) { rowHeight=height; } } x = x+width+INNER_H_MARGIN; } if(childCount==0||x>getPaddingLeft()){ y = y+rowHeight+getPaddingBottom(); }else{ y=y-INNER_V_MARGIN+getPaddingBottom(); } setMeasuredDimension(maxWidth, y); } }
相关文章推荐
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- Android自定义组件之自动换行View - 儒雅小生
- 【Android进阶】Android自定义组件之自动换行View,以TextView为例
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现
- Android-浅析自定义ViewGroup(附一个子控件根据父控件行宽自动换行的LineWrapLayout 案例)
- Android自定义组件之自动换行View - 儒雅小生
- Android自定义组件之自动换行View
- android之自定义ViewGroup和自动换行的布局的实现
- android之自定义ViewGroup和自动换行的布局的实现