您的位置:首页 > 移动开发 > Android开发

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