简单的自定义ViewGroup
Posted 丛林小阁楼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的自定义ViewGroup相关的知识,希望对你有一定的参考价值。
自定义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的主要内容,如果未能解决你的问题,请参考以下文章
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段