package com.parttime.widget; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import com.qingmu.jianzhidaren.R; /** * Created by cjz on 2015/7/18. */ public class CommonShowItemLayout extends ViewGroup{ private int verticleInnerMargin, horizontalInnerMargin; private int columnCount; private int itemHeight; private int itemWidth; protected Context context; protected boolean initExecuted; public CommonShowItemLayout(Context context) { super(context); if(!initExecuted){ initExecuted = true; init(context, null); } } public CommonShowItemLayout(Context context, AttributeSet attrs) { super(context, attrs); if(!initExecuted){ initExecuted = true; init(context, attrs); } } public CommonShowItemLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if(!initExecuted){ initExecuted = true; init(context, attrs); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public CommonShowItemLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); if(!initExecuted){ initExecuted = true; init(context, attrs); } } protected void init(Context context, AttributeSet attrs){ this.context = context; Resources res = context.getResources(); horizontalInnerMargin = res.getDimensionPixelSize(R.dimen.csil_horizontal_inner_margin_default); verticleInnerMargin = res.getDimensionPixelSize(R.dimen.csil_verticle_inner_margin_default); itemHeight = res.getDimensionPixelSize(R.dimen.csil_item_height_default); columnCount = 3; if(attrs != null){ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CommonShowItemLayout); if(typedArray != null){ horizontalInnerMargin = typedArray.getDimensionPixelSize(R.styleable.CommonShowItemLayout_csil_horizontalInnerMargin, horizontalInnerMargin); verticleInnerMargin = typedArray.getDimensionPixelSize(R.styleable.CommonShowItemLayout_csil_verticleInnerMargin, verticleInnerMargin); itemHeight = typedArray.getDimensionPixelSize(R.styleable.CommonShowItemLayout_csil_itemHeight, itemHeight); columnCount = typedArray.getInt(R.styleable.CommonShowItemLayout_csil_columnCount, columnCount); } } } // public void setAda @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int measuredWidth = getMeasuredWidth(); int measuredHeight = getMeasuredHeight(); int paddingLeft = getPaddingLeft(); int paddingTop = getPaddingTop(); int paddingRight = getPaddingRight(); int x = paddingLeft; int y = paddingTop; int childCount = getChildCount(); View child; for(int i = 0; i < childCount; ++i){ child = getChildAt(i); child.layout(x, y, x + itemWidth, y + itemHeight); x += (itemWidth + horizontalInnerMargin); if((i + 1) % columnCount == 0){ x = paddingLeft; y += (itemHeight + verticleInnerMargin); } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measuredWidth = measureWidth(widthMeasureSpec); int measuredHeight = measureHeight(measuredWidth, heightMeasureSpec); int paddingLeft = getPaddingLeft(); int paddingTop = getPaddingTop(); int paddingRight = getPaddingRight(); int paddingBottom = getPaddingBottom(); itemWidth = (measuredWidth - paddingLeft - paddingRight - (columnCount - 1) * horizontalInnerMargin) / columnCount; int cellWidthSpec = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY); int cellHeightSpec = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY); int count = getChildCount(); for (int i = 0; i < count; i++) { View childView = getChildAt(i); childView.measure(cellWidthSpec, cellHeightSpec); } setMeasuredDimension(/*resolveSize(getMeasuredWidth(), widthMeasureSpec), resolveSize(getMeasuredHeight(), heightMeasureSpec)*/measuredWidth, measuredHeight); } private int measureHeight(int measureWidth, int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); // // // int result; // // if (specMode == MeasureSpec.AT_MOST){ // // result = specSize; // } // else if (specMode == MeasureSpec.EXACTLY){ // // result = specSize; // } else { if( specMode == MeasureSpec.EXACTLY){ result = specSize; }else { int childCount = getChildCount(); int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); result = getPaddingTop() + getPaddingBottom(); int rowCount = childCount % columnCount > 0 ? childCount / columnCount + 1 : childCount / columnCount; result += rowCount * itemHeight; if(rowCount > 0){ result += (rowCount - 1) * verticleInnerMargin; } } return result; } private int measureWidth(int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); int result = 500; if (specMode == MeasureSpec.AT_MOST){ result = specSize; } else if (specMode == MeasureSpec.EXACTLY){ result = specSize; } return result; } }