package com.videogo.widget;
|
|
import android.annotation.SuppressLint;
|
import android.content.Context;
|
import android.content.res.TypedArray;
|
import android.graphics.Canvas;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.util.AttributeSet;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.LinearLayout;
|
|
import ezviz.ezopensdk.R;
|
|
|
public class GroupLayout extends LinearLayout {
|
|
private int mDividerColor;
|
private int mDividerHeight;
|
private int mDividerPadding;
|
|
private LayoutParamsHolder mLayoutParamsHolder;
|
|
private Paint mDividerPaint;
|
private int mItemSelectorResId;
|
|
public GroupLayout(Context context) {
|
this(context, null);
|
}
|
|
public GroupLayout(Context context, AttributeSet attrs) {
|
super(context, attrs);
|
init(context, attrs);
|
}
|
|
private void init(Context context, AttributeSet attrs) {
|
setOrientation(VERTICAL);
|
|
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GroupLayout);
|
|
mDividerHeight = a.getDimensionPixelSize(R.styleable.GroupLayout_dividerHeight, 0);
|
mDividerPadding = a.getDimensionPixelSize(R.styleable.GroupLayout_dividerPadding, 0);
|
mDividerColor = a.getColor(R.styleable.GroupLayout_dividerColor, Color.TRANSPARENT);
|
mItemSelectorResId = a.getResourceId(R.styleable.GroupLayout_itemSelector, 0);
|
|
a.recycle();
|
|
mDividerPaint = new Paint();
|
mDividerPaint.setColor(mDividerColor);
|
}
|
|
@SuppressLint("DrawAllocation")
|
@Override
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
int visibleChildCount = 0;
|
for (int i = 0; i < getChildCount(); i++) {
|
if (getChildAt(i).getVisibility() != View.GONE)
|
visibleChildCount++;
|
}
|
|
if (visibleChildCount == 0) {
|
if (mLayoutParamsHolder == null) {
|
if (getLayoutParams() instanceof MarginLayoutParams) {
|
MarginLayoutParams marginLayoutParams = (MarginLayoutParams) getLayoutParams();
|
|
mLayoutParamsHolder = new LayoutParamsHolder();
|
mLayoutParamsHolder.topMargin = marginLayoutParams.topMargin;
|
mLayoutParamsHolder.bottomMargin = marginLayoutParams.bottomMargin;
|
|
marginLayoutParams.topMargin = 0;
|
marginLayoutParams.bottomMargin = 0;
|
}
|
}
|
setMeasuredDimension(getMeasuredWidth(), 0);
|
} else {
|
if (mLayoutParamsHolder != null) {
|
if (getLayoutParams() instanceof MarginLayoutParams) {
|
MarginLayoutParams marginLayoutParams = (MarginLayoutParams) getLayoutParams();
|
|
marginLayoutParams.topMargin = mLayoutParamsHolder.topMargin;
|
marginLayoutParams.bottomMargin = mLayoutParamsHolder.bottomMargin;
|
|
mLayoutParamsHolder = null;
|
}
|
}
|
setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + (visibleChildCount + 1) * mDividerHeight);
|
}
|
}
|
|
@Override
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
super.onLayout(changed, l, t, r, b);
|
int visibleChildCount = 0;
|
for (int i = 0; i < getChildCount(); i++) {
|
View child = getChildAt(i);
|
if (child.getVisibility() != View.GONE) {
|
visibleChildCount++;
|
int offset = (visibleChildCount) * mDividerHeight;
|
child.layout(child.getLeft(), child.getTop() + offset, child.getRight(), child.getBottom() + offset);
|
}
|
}
|
}
|
|
@Override
|
public void addView(View child, int index, ViewGroup.LayoutParams params) {
|
child.setBackgroundResource(mItemSelectorResId);
|
super.addView(child, index, params);
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
|
int visibleChildCount = 0;
|
for (int i = 0; i < getChildCount(); i++) {
|
View child = getChildAt(i);
|
if (child.getVisibility() != View.GONE) {
|
canvas.drawRect(visibleChildCount == 0 ? 0 : mDividerPadding, child.getTop() - mDividerHeight,
|
getMeasuredWidth(), child.getTop(), mDividerPaint);
|
visibleChildCount++;
|
}
|
}
|
|
if (visibleChildCount > 0)
|
canvas.drawRect(0, getMeasuredHeight() - mDividerHeight, getMeasuredWidth(), getMeasuredHeight(),
|
mDividerPaint);
|
}
|
|
protected static class LayoutParamsHolder {
|
int topMargin;
|
int bottomMargin;
|
}
|
}
|