package com.devsmart.android.ui; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; public class EqualSpaceLayout extends ViewGroup { private int mOrientation = LinearLayout.HORIZONTAL; private int mMaxChildWidth; private int mMaxChildHeight; private int mNumVisibleChildren; public EqualSpaceLayout(Context context){ super(context); initDefaults(); } public EqualSpaceLayout(Context context, AttributeSet attrs) { super(context, attrs); initDefaults(); { TypedArray a = context.obtainStyledAttributes(attrs, new int[]{ android.R.attr.layout_width, android.R.attr.layout_height, }); int layoutwidth = a.getLayoutDimension(0, ViewGroup.LayoutParams.WRAP_CONTENT); int layoutheight = a.getLayoutDimension(1, ViewGroup.LayoutParams.WRAP_CONTENT); setLayoutParams(new ViewGroup.LayoutParams(layoutwidth, layoutheight)); a.recycle(); } { TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.orientation}); mOrientation = a.getInt(0, LinearLayout.HORIZONTAL); a.recycle(); } } private void initDefaults() { setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } public void setOrientation(int orient){ mOrientation = orient; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int count = getChildCount(); mNumVisibleChildren = 0; for(int i=0;i<count;i++){ final View child = getChildAt(i); if (child.getVisibility() != GONE) { mNumVisibleChildren++; } } if(mNumVisibleChildren == 0){ return; } int maxChildWidth = mOrientation == LinearLayout.HORIZONTAL ? (MeasureSpec.getSize(widthMeasureSpec) / mNumVisibleChildren) : MeasureSpec.getSize(widthMeasureSpec); int maxChildHeight = mOrientation == LinearLayout.VERTICAL ? (MeasureSpec.getSize(heightMeasureSpec) / mNumVisibleChildren) : MeasureSpec.getSize(heightMeasureSpec); final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec( MeasureSpec.getSize(maxChildWidth), MeasureSpec.AT_MOST); final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec( MeasureSpec.getSize(maxChildHeight), MeasureSpec.AT_MOST); mMaxChildWidth = 0; mMaxChildHeight = 0; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } child.measure(childWidthMeasureSpec, childHeightMeasureSpec); if(mOrientation == LinearLayout.HORIZONTAL){ mMaxChildWidth += child.getMeasuredWidth(); } else { mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth()); } if(mOrientation == LinearLayout.VERTICAL){ mMaxChildHeight += child.getMeasuredHeight(); } else { mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight()); } } int width = resolveSize(mMaxChildWidth, widthMeasureSpec); int height = resolveSize(mMaxChildHeight, heightMeasureSpec); setMeasuredDimension(width, height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { final int count = getChildCount(); int spacing = 0; if(mOrientation == LinearLayout.HORIZONTAL){ spacing = ((r-l) - mMaxChildWidth) / mNumVisibleChildren; } else if(mOrientation == LinearLayout.VERTICAL){ spacing = ((b-t) - mMaxChildHeight) / mNumVisibleChildren; } l = -spacing / 2; t = -spacing / 2; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } if(mOrientation == LinearLayout.HORIZONTAL){ l += spacing; r = l + child.getMeasuredWidth(); child.layout(l, 0, r, child.getMeasuredHeight()); l = r; } else if(mOrientation == LinearLayout.VERTICAL){ t += spacing; b = t + child.getMeasuredHeight(); child.layout(0, t, child.getMeasuredWidth(), b); t = b; } } } }