自定义ViewGroup需要重写onMeasure, onLayout等方法。下面是一个实例,4个View分别显示在四个角。
public class MyGroup extends ViewGroup{ private View viewA, viewB, viewC, viewD; public MyGroup(Context context) {
this(context, null);
} public MyGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public MyGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
} private void init(){ } @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); // 计算出所有的childView的宽和高
measureChildren(widthMeasureSpec, heightMeasureSpec); int totalW1 = 0, totalH1 = 0;
int totalW2 = 0, totalH2 = 0;
for(int i=0; i<getChildCount(); ++i){
View child = getChildAt(i);
MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams();
int cw = child.getMeasuredWidth(), ch = child.getMeasuredHeight();
int lm = params.leftMargin, rm = params.rightMargin;
int tm = params.topMargin, bm = params.bottomMargin; if(i == 0){
totalW1 += lm + cw + rm;
totalH1 += tm + ch + bm;
}
else if(i == 1){
totalW1 += lm + cw + rm;
totalH2 += tm + ch + bm;
}
else if(i == 2){
totalW2 += lm + cw + rm;
totalH1 += tm + ch + bm;
}
else if(i == 3){
totalW2 += lm + cw + rm;
totalH2 += tm + ch + bm;
}
}
int width = Math.max(totalW1, totalW2);
int height = Math.max(totalH1, totalH2); int targetWidth = sizeWidth;
int targetHeight = sizeHeight;
if(widthMode == MeasureSpec.AT_MOST){
targetWidth = width;
}
if(heightMode == MeasureSpec.AT_MOST){
targetHeight = height;
}
setMeasuredDimension(targetWidth, targetHeight); } @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for(int i=0; i<getChildCount(); ++i){
View child = getChildAt(i);
MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams(); int cw = child.getMeasuredWidth();
int ch = child.getMeasuredHeight();
int lm = params.leftMargin;
int tm = params.topMargin;
int rm = params.rightMargin;
int bm = params.bottomMargin; if(i == 0){
child.layout(lm, tm, lm+cw, tm+ch);
}
else if(i == 1){
child.layout(getWidth()-rm-cw, tm, getWidth()-rm, tm+ch);
}
else if(i == 2){
child.layout(lm, getHeight()-bm-ch, lm+cw, getHeight()-bm);
}
else if(i == 3){
child.layout(getWidth()-rm-cw, getHeight()-bm-ch, getWidth()-rm, getHeight()-bm);
}
}
} @Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
// return super.generateLayoutParams(attrs);
return new MarginLayoutParams(getContext(), attrs);
} @Override
public void draw(Canvas canvas) {
super.draw(canvas);
}
}