Blame | Last modification | View Log | RSS feed
package com.viewpagerindicator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.drawable.Drawable;import android.view.View;import android.widget.LinearLayout;/*** A simple extension of a regular linear layout that supports the divider API* of Android 4.0+. The dividers are added adjacent to the children by changing* their layout params. If you need to rely on the margins which fall in the* same orientation as the layout you should wrap the child in a simple* {@link android.widget.FrameLayout} so it can receive the margin.*/class IcsLinearLayout extends LinearLayout {private static final int[] LL = new int[] {/* 0 */ android.R.attr.divider,/* 1 */ android.R.attr.showDividers,/* 2 */ android.R.attr.dividerPadding,};private static final int LL_DIVIDER = 0;private static final int LL_SHOW_DIVIDER = 1;private static final int LL_DIVIDER_PADDING = 2;private Drawable mDivider;private int mDividerWidth;private int mDividerHeight;private int mShowDividers;private int mDividerPadding;public IcsLinearLayout(Context context, int themeAttr) {super(context);TypedArray a = context.obtainStyledAttributes(null, LL, themeAttr, 0);setDividerDrawable(a.getDrawable(IcsLinearLayout.LL_DIVIDER));mDividerPadding = a.getDimensionPixelSize(LL_DIVIDER_PADDING, 0);mShowDividers = a.getInteger(LL_SHOW_DIVIDER, SHOW_DIVIDER_NONE);a.recycle();}public void setDividerDrawable(Drawable divider) {if (divider == mDivider) {return;}mDivider = divider;if (divider != null) {mDividerWidth = divider.getIntrinsicWidth();mDividerHeight = divider.getIntrinsicHeight();} else {mDividerWidth = 0;mDividerHeight = 0;}setWillNotDraw(divider == null);requestLayout();}@Overrideprotected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {final int index = indexOfChild(child);final int orientation = getOrientation();final LayoutParams params = (LayoutParams) child.getLayoutParams();if (hasDividerBeforeChildAt(index)) {if (orientation == VERTICAL) {//Account for the divider by pushing everything upparams.topMargin = mDividerHeight;} else {//Account for the divider by pushing everything leftparams.leftMargin = mDividerWidth;}}final int count = getChildCount();if (index == count - 1) {if (hasDividerBeforeChildAt(count)) {if (orientation == VERTICAL) {params.bottomMargin = mDividerHeight;} else {params.rightMargin = mDividerWidth;}}}super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);}@Overrideprotected void onDraw(Canvas canvas) {if (mDivider != null) {if (getOrientation() == VERTICAL) {drawDividersVertical(canvas);} else {drawDividersHorizontal(canvas);}}super.onDraw(canvas);}private void drawDividersVertical(Canvas canvas) {final int count = getChildCount();for (int i = 0; i < count; i++) {final View child = getChildAt(i);if (child != null && child.getVisibility() != GONE) {if (hasDividerBeforeChildAt(i)) {final android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) child.getLayoutParams();final int top = child.getTop() - lp.topMargin/* - mDividerHeight*/;drawHorizontalDivider(canvas, top);}}}if (hasDividerBeforeChildAt(count)) {final View child = getChildAt(count - 1);int bottom = 0;if (child == null) {bottom = getHeight() - getPaddingBottom() - mDividerHeight;} else {//final LayoutParams lp = (LayoutParams) child.getLayoutParams();bottom = child.getBottom()/* + lp.bottomMargin*/;}drawHorizontalDivider(canvas, bottom);}}private void drawDividersHorizontal(Canvas canvas) {final int count = getChildCount();for (int i = 0; i < count; i++) {final View child = getChildAt(i);if (child != null && child.getVisibility() != GONE) {if (hasDividerBeforeChildAt(i)) {final android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) child.getLayoutParams();final int left = child.getLeft() - lp.leftMargin/* - mDividerWidth*/;drawVerticalDivider(canvas, left);}}}if (hasDividerBeforeChildAt(count)) {final View child = getChildAt(count - 1);int right = 0;if (child == null) {right = getWidth() - getPaddingRight() - mDividerWidth;} else {//final LayoutParams lp = (LayoutParams) child.getLayoutParams();right = child.getRight()/* + lp.rightMargin*/;}drawVerticalDivider(canvas, right);}}private void drawHorizontalDivider(Canvas canvas, int top) {mDivider.setBounds(getPaddingLeft() + mDividerPadding, top,getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight);mDivider.draw(canvas);}private void drawVerticalDivider(Canvas canvas, int left) {mDivider.setBounds(left, getPaddingTop() + mDividerPadding,left + mDividerWidth, getHeight() - getPaddingBottom() - mDividerPadding);mDivider.draw(canvas);}private boolean hasDividerBeforeChildAt(int childIndex) {if (childIndex == 0 || childIndex == getChildCount()) {return false;}if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) {boolean hasVisibleViewBefore = false;for (int i = childIndex - 1; i >= 0; i--) {if (getChildAt(i).getVisibility() != GONE) {hasVisibleViewBefore = true;break;}}return hasVisibleViewBefore;}return false;}}