1. 程式人生 > >簡單的自定義ViewGroup

簡單的自定義ViewGroup

new ldr ride htm 定義 pan ren count() @override

自定義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); } }

簡單的自定義ViewGroup