| 21481 |
rajender |
1 |
package com.viewpagerindicator;
|
|
|
2 |
|
|
|
3 |
import android.content.Context;
|
|
|
4 |
import android.content.res.TypedArray;
|
|
|
5 |
import android.graphics.Canvas;
|
|
|
6 |
import android.graphics.drawable.Drawable;
|
|
|
7 |
import android.view.View;
|
|
|
8 |
import android.widget.LinearLayout;
|
|
|
9 |
|
|
|
10 |
/**
|
|
|
11 |
* A simple extension of a regular linear layout that supports the divider API
|
|
|
12 |
* of Android 4.0+. The dividers are added adjacent to the children by changing
|
|
|
13 |
* their layout params. If you need to rely on the margins which fall in the
|
|
|
14 |
* same orientation as the layout you should wrap the child in a simple
|
|
|
15 |
* {@link android.widget.FrameLayout} so it can receive the margin.
|
|
|
16 |
*/
|
|
|
17 |
class IcsLinearLayout extends LinearLayout {
|
|
|
18 |
private static final int[] LL = new int[] {
|
|
|
19 |
/* 0 */ android.R.attr.divider,
|
|
|
20 |
/* 1 */ android.R.attr.showDividers,
|
|
|
21 |
/* 2 */ android.R.attr.dividerPadding,
|
|
|
22 |
};
|
|
|
23 |
private static final int LL_DIVIDER = 0;
|
|
|
24 |
private static final int LL_SHOW_DIVIDER = 1;
|
|
|
25 |
private static final int LL_DIVIDER_PADDING = 2;
|
|
|
26 |
|
|
|
27 |
private Drawable mDivider;
|
|
|
28 |
private int mDividerWidth;
|
|
|
29 |
private int mDividerHeight;
|
|
|
30 |
private int mShowDividers;
|
|
|
31 |
private int mDividerPadding;
|
|
|
32 |
|
|
|
33 |
|
|
|
34 |
public IcsLinearLayout(Context context, int themeAttr) {
|
|
|
35 |
super(context);
|
|
|
36 |
|
|
|
37 |
TypedArray a = context.obtainStyledAttributes(null, LL, themeAttr, 0);
|
|
|
38 |
setDividerDrawable(a.getDrawable(IcsLinearLayout.LL_DIVIDER));
|
|
|
39 |
mDividerPadding = a.getDimensionPixelSize(LL_DIVIDER_PADDING, 0);
|
|
|
40 |
mShowDividers = a.getInteger(LL_SHOW_DIVIDER, SHOW_DIVIDER_NONE);
|
|
|
41 |
a.recycle();
|
|
|
42 |
}
|
|
|
43 |
|
|
|
44 |
public void setDividerDrawable(Drawable divider) {
|
|
|
45 |
if (divider == mDivider) {
|
|
|
46 |
return;
|
|
|
47 |
}
|
|
|
48 |
mDivider = divider;
|
|
|
49 |
if (divider != null) {
|
|
|
50 |
mDividerWidth = divider.getIntrinsicWidth();
|
|
|
51 |
mDividerHeight = divider.getIntrinsicHeight();
|
|
|
52 |
} else {
|
|
|
53 |
mDividerWidth = 0;
|
|
|
54 |
mDividerHeight = 0;
|
|
|
55 |
}
|
|
|
56 |
setWillNotDraw(divider == null);
|
|
|
57 |
requestLayout();
|
|
|
58 |
}
|
|
|
59 |
|
|
|
60 |
@Override
|
|
|
61 |
protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
|
|
|
62 |
final int index = indexOfChild(child);
|
|
|
63 |
final int orientation = getOrientation();
|
|
|
64 |
final LayoutParams params = (LayoutParams) child.getLayoutParams();
|
|
|
65 |
if (hasDividerBeforeChildAt(index)) {
|
|
|
66 |
if (orientation == VERTICAL) {
|
|
|
67 |
//Account for the divider by pushing everything up
|
|
|
68 |
params.topMargin = mDividerHeight;
|
|
|
69 |
} else {
|
|
|
70 |
//Account for the divider by pushing everything left
|
|
|
71 |
params.leftMargin = mDividerWidth;
|
|
|
72 |
}
|
|
|
73 |
}
|
|
|
74 |
|
|
|
75 |
final int count = getChildCount();
|
|
|
76 |
if (index == count - 1) {
|
|
|
77 |
if (hasDividerBeforeChildAt(count)) {
|
|
|
78 |
if (orientation == VERTICAL) {
|
|
|
79 |
params.bottomMargin = mDividerHeight;
|
|
|
80 |
} else {
|
|
|
81 |
params.rightMargin = mDividerWidth;
|
|
|
82 |
}
|
|
|
83 |
}
|
|
|
84 |
}
|
|
|
85 |
super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
|
|
|
86 |
}
|
|
|
87 |
|
|
|
88 |
@Override
|
|
|
89 |
protected void onDraw(Canvas canvas) {
|
|
|
90 |
if (mDivider != null) {
|
|
|
91 |
if (getOrientation() == VERTICAL) {
|
|
|
92 |
drawDividersVertical(canvas);
|
|
|
93 |
} else {
|
|
|
94 |
drawDividersHorizontal(canvas);
|
|
|
95 |
}
|
|
|
96 |
}
|
|
|
97 |
super.onDraw(canvas);
|
|
|
98 |
}
|
|
|
99 |
|
|
|
100 |
private void drawDividersVertical(Canvas canvas) {
|
|
|
101 |
final int count = getChildCount();
|
|
|
102 |
for (int i = 0; i < count; i++) {
|
|
|
103 |
final View child = getChildAt(i);
|
|
|
104 |
|
|
|
105 |
if (child != null && child.getVisibility() != GONE) {
|
|
|
106 |
if (hasDividerBeforeChildAt(i)) {
|
|
|
107 |
final android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) child.getLayoutParams();
|
|
|
108 |
final int top = child.getTop() - lp.topMargin/* - mDividerHeight*/;
|
|
|
109 |
drawHorizontalDivider(canvas, top);
|
|
|
110 |
}
|
|
|
111 |
}
|
|
|
112 |
}
|
|
|
113 |
|
|
|
114 |
if (hasDividerBeforeChildAt(count)) {
|
|
|
115 |
final View child = getChildAt(count - 1);
|
|
|
116 |
int bottom = 0;
|
|
|
117 |
if (child == null) {
|
|
|
118 |
bottom = getHeight() - getPaddingBottom() - mDividerHeight;
|
|
|
119 |
} else {
|
|
|
120 |
//final LayoutParams lp = (LayoutParams) child.getLayoutParams();
|
|
|
121 |
bottom = child.getBottom()/* + lp.bottomMargin*/;
|
|
|
122 |
}
|
|
|
123 |
drawHorizontalDivider(canvas, bottom);
|
|
|
124 |
}
|
|
|
125 |
}
|
|
|
126 |
|
|
|
127 |
private void drawDividersHorizontal(Canvas canvas) {
|
|
|
128 |
final int count = getChildCount();
|
|
|
129 |
for (int i = 0; i < count; i++) {
|
|
|
130 |
final View child = getChildAt(i);
|
|
|
131 |
|
|
|
132 |
if (child != null && child.getVisibility() != GONE) {
|
|
|
133 |
if (hasDividerBeforeChildAt(i)) {
|
|
|
134 |
final android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) child.getLayoutParams();
|
|
|
135 |
final int left = child.getLeft() - lp.leftMargin/* - mDividerWidth*/;
|
|
|
136 |
drawVerticalDivider(canvas, left);
|
|
|
137 |
}
|
|
|
138 |
}
|
|
|
139 |
}
|
|
|
140 |
|
|
|
141 |
if (hasDividerBeforeChildAt(count)) {
|
|
|
142 |
final View child = getChildAt(count - 1);
|
|
|
143 |
int right = 0;
|
|
|
144 |
if (child == null) {
|
|
|
145 |
right = getWidth() - getPaddingRight() - mDividerWidth;
|
|
|
146 |
} else {
|
|
|
147 |
//final LayoutParams lp = (LayoutParams) child.getLayoutParams();
|
|
|
148 |
right = child.getRight()/* + lp.rightMargin*/;
|
|
|
149 |
}
|
|
|
150 |
drawVerticalDivider(canvas, right);
|
|
|
151 |
}
|
|
|
152 |
}
|
|
|
153 |
|
|
|
154 |
private void drawHorizontalDivider(Canvas canvas, int top) {
|
|
|
155 |
mDivider.setBounds(getPaddingLeft() + mDividerPadding, top,
|
|
|
156 |
getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight);
|
|
|
157 |
mDivider.draw(canvas);
|
|
|
158 |
}
|
|
|
159 |
|
|
|
160 |
private void drawVerticalDivider(Canvas canvas, int left) {
|
|
|
161 |
mDivider.setBounds(left, getPaddingTop() + mDividerPadding,
|
|
|
162 |
left + mDividerWidth, getHeight() - getPaddingBottom() - mDividerPadding);
|
|
|
163 |
mDivider.draw(canvas);
|
|
|
164 |
}
|
|
|
165 |
|
|
|
166 |
private boolean hasDividerBeforeChildAt(int childIndex) {
|
|
|
167 |
if (childIndex == 0 || childIndex == getChildCount()) {
|
|
|
168 |
return false;
|
|
|
169 |
}
|
|
|
170 |
if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) {
|
|
|
171 |
boolean hasVisibleViewBefore = false;
|
|
|
172 |
for (int i = childIndex - 1; i >= 0; i--) {
|
|
|
173 |
if (getChildAt(i).getVisibility() != GONE) {
|
|
|
174 |
hasVisibleViewBefore = true;
|
|
|
175 |
break;
|
|
|
176 |
}
|
|
|
177 |
}
|
|
|
178 |
return hasVisibleViewBefore;
|
|
|
179 |
}
|
|
|
180 |
return false;
|
|
|
181 |
}
|
|
|
182 |
}
|