标签:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
package
com.phodev.andtools.widget; import
android.content.Context; import
android.graphics.Rect; import
android.util.AttributeSet; import
android.view.View; import
android.view.ViewGroup; /** *
由于ListView,Gridiew,等高度设置为wrap_content的时候会有问题,如果此时下面还有其他view, *
当AdapterView的item很多的上海,不仅scroll有问题,底部跟随的view也会跑到可是范围外 *
*
<pre> *
<com.phodev.widgets.AutoFollowBox> *
<ListView *
android:layout_width="fill_parent" *
android:layout_height="wrap_content"// 必须是wrap content,否则没有必要使用该组建,直接布局即可 *
/> *
<OtherView/>//有切只有有一个OtherView如果底部是多个View,可以放到一个布局里面。总是AutoFollowBox有切职能有两个Child *
<com.phodev.widgets.AutoFollowBox/> *
</pre> *
*
@author sky *
*/ public
class
AutoFollowBox extends
ViewGroup { public
AutoFollowBox(Context context, AttributeSet attrs) { super (context,
attrs); } public
AutoFollowBox(Context context) { super (context); } private
Rect marginInfo = new
Rect(); @Override protected
void
onLayout( boolean
changed, int
l, int
t, int
r, int
b) { int
childCount = getChildCount(); int
maxW = r - l; int
cl, ct, cr, cb; int
heightOffset = 0 ; for
( int
i = 0 ;
i < childCount; i++) { View
v = getChildAt(i); getMargingInfo(v,
marginInfo); cl
= marginInfo.left; ct
= marginInfo.top + heightOffset; cr
= maxW - marginInfo.right; cb
= ct + v.getMeasuredHeight(); v.layout(cl,
ct, cr, cb); heightOffset
= cb + marginInfo.bottom; } } @Override protected
void
onMeasure( int
widthMeasureSpec, int
heightMeasureSpec) { int
childCount = getChildCount(); if
(childCount != 2 )
{ throw
new
RuntimeException( "mast
only 2 views is AutoFoolowAdapterViewBox" ); } // View
stretchView = getChildAt( 0 ); View
followView = getChildAt( 1 ); //
start measure int
offsetBottom = 0 ; int
followViewHeihgt = 0 ; if
(followView.getVisibility() == View.VISIBLE) { LayoutParams
lp = followView.getLayoutParams(); measureChildWithMargins(followView,
widthMeasureSpec, 0 , heightMeasureSpec,
0 ); followViewHeihgt
= followView.getMeasuredHeight(); if
(lp instanceof
MarginLayoutParams) { MarginLayoutParams
mlp = (MarginLayoutParams) lp; offsetBottom
= mlp.topMargin + mlp.bottomMargin +
followViewHeihgt; } } // if
(stretchView.getVisibility() == View.VISIBLE) { measureChildWithMargins(stretchView,
widthMeasureSpec, 0 , heightMeasureSpec,
offsetBottom); } // int
maxWantWitdh = Math.max(getMeasuerWidthWithMarging(followView), getMeasuerWidthWithMarging(stretchView)); int
maxWantHeight = getMeasuerHeightWithMarging(stretchView) +
getMeasuerHeightWithMarging(followView); // int
measuredWidth = resolveSize(maxWantWitdh, widthMeasureSpec); int
measuredHeight = resolveSize(maxWantHeight, heightMeasureSpec); setMeasuredDimension(measuredWidth,
measuredHeight); } private
int
getMeasuerHeightWithMarging(View v) { LayoutParams
lp = v.getLayoutParams(); int
hAdd = 0 ; if
(lp instanceof
MarginLayoutParams) { MarginLayoutParams
mlp = (MarginLayoutParams) lp; hAdd
= mlp.topMargin + mlp.bottomMargin; } return
v.getMeasuredHeight() + hAdd; } private
int
getMeasuerWidthWithMarging(View v) { LayoutParams
lp = v.getLayoutParams(); int
wAdd = 0 ; if
(lp instanceof
MarginLayoutParams) { MarginLayoutParams
mlp = (MarginLayoutParams) lp; wAdd
= mlp.leftMargin + mlp.rightMargin; } return
v.getMeasuredWidth() + wAdd; } private
void
getMargingInfo(View v, Rect out) { if
(v != null
&& v.getLayoutParams() instanceof
MarginLayoutParams) { MarginLayoutParams
mlp = (MarginLayoutParams) v.getLayoutParams(); // out.set(mlp.leftMargin, // mlp.topMargin, // mlp.rightMargin, // mlp.bottomMargin); }
else
{ out.set( 0 ,
0 ,
0 ,
0 ); } } @Override protected
LayoutParams generateDefaultLayoutParams() { return
new
MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } @Override public
LayoutParams generateLayoutParams(AttributeSet attrs) { return
new
MarginLayoutParams(getContext(), attrs); } } |
标签:
原文地址:http://blog.csdn.net/u014311051/article/details/42644165