天天看点

Android第三十八期 - 评价标签FlowLayout

    代码已经整理好,这里要说一下,因为手动和Json获取写法不一样。

    手动直接xml设置:  

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

<code>    </code><code>&lt;LinearLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>

<code>    </code><code>xmlns:tools=</code><code>"http://schemas.android.com/tools"</code>

<code>    </code><code>android:layout_width=</code><code>"fill_parent"</code>

<code>    </code><code>android:layout_height=</code><code>"fill_parent"</code>

<code>    </code><code>android:background=</code><code>"#E1E6F6"</code>

<code>    </code><code>android:orientation=</code><code>"vertical"</code> <code>&gt;</code>

<code>    </code><code>&lt;com.zhy.zhy_flowlayout02.FlowLayout</code>

<code>        </code><code>android:layout_width=</code><code>"fill_parent"</code>

<code>        </code><code>android:layout_height=</code><code>"wrap_content"</code> <code>&gt;</code>

<code>        </code><code>&lt;TextView</code>

<code>            </code><code>style=</code><code>"@style/text_flag_01"</code>

<code>            </code><code>android:text=</code><code>"Welcome"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"IT工程师"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"学习ing"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"恋爱ing"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"挣钱ing"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"努力ing"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"I thick i can"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/com.zhy.zhy_flowlayout02.FlowLayout&gt;</code>

<code>    </code> 

<code>        </code><code>android:layout_height=</code><code>"wrap_content"</code>

<code>        </code><code>android:layout_marginTop=</code><code>"20dp"</code> <code>&gt;</code>

<code>            </code><code>android:background=</code><code>"@drawable/flag_02"</code>

<code>            </code><code>android:text=</code><code>"Welcome"</code>

<code>            </code><code>android:textColor=</code><code>"#888888"</code> <code>/&gt;</code>

<code>            </code><code>android:text=</code><code>"IT工程师"</code>

<code>            </code><code>android:text=</code><code>"学习ing"</code>

<code>            </code><code>android:text=</code><code>"恋爱ing"</code>

<code>            </code><code>android:text=</code><code>"挣钱ing"</code>

<code>            </code><code>android:text=</code><code>"努力ing"</code>

<code>            </code><code>android:text=</code><code>"I thick i can"</code>

<code>            </code><code>android:background=</code><code>"@drawable/flag_03"</code>

<code>            </code><code>android:textColor=</code><code>"#43BBE7"</code> <code>/&gt;</code>

<code>&lt;/LinearLayout&gt;</code>

    效果如下:

    Json获取:

<code>    </code><code>if</code><code>(message.what == </code><code>1</code><code>) {</code>

<code>        </code><code>// 处理操作</code>

<code>        </code><code>pingjia = newArrayList&lt;Pingjia&gt;();</code>

<code>        </code><code>pingjia.addAll(JsonUtils.getBeanList(message.result,</code><code>"Items"</code><code>,</code>

<code>        </code><code>Pingjia.</code><code>class</code><code>));</code>

<code>        </code><code>FlowLayout layout = (FlowLayout)findViewById(R.id.layou23);</code>

<code>        </code><code>LinearLayout.LayoutParams params = newLinearLayout.LayoutParams(</code>

<code>        </code><code>LinearLayout.LayoutParams.WRAP_CONTENT,</code>

<code>        </code><code>LinearLayout.LayoutParams.WRAP_CONTENT);</code>

<code>        </code><code>params.gravity =Gravity.CENTER_VERTICAL;</code>

<code>         </code> 

<code>        </code><code>// 加载TextView</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; pingjia.size();i++) {</code>

<code>        </code><code>Pingjia ping = pingjia.get(i);</code>

<code>        </code><code>tvNav = </code><code>new</code> <code>TextView(</code><code>this</code><code>);</code>

<code>        </code><code>tvNav.setTextSize(</code><code>13</code><code>.f);</code>

<code>        </code><code>// tvNav.setWidth((int)Math.floor(Double.valueOf(a)));</code>

<code>        </code><code>// tvNav.setHeight((int)Math.floor(Double.valueOf(b)));</code>

<code>        </code><code>tvNav.setText(ping.getContent());</code>

<code>        </code><code>tvNav.setId(ping.getId());</code>

<code>        </code><code>tvNav.setBackgroundResource(R.anim.flag_022);</code>

<code>        </code><code>tvNav.setTag(</code><code>false</code><code>);</code>

<code>        </code><code>tvNav.setTextColor(getResources().getColor(R.color.gray));</code>

<code>        </code><code>// tvNav.setPadding(30, 10, 30, 10);</code>

<code>        </code><code>// tvNav.setGravity(Gravity.CENTER_HORIZONTAL);</code>

<code>        </code><code>tvNav.setOnClickListener(newTvClickListener(tvNav));</code>

<code>        </code><code>layout.addView(tvNav, params);</code>

<code>    </code><code>}</code>

<code>    </code><code>private</code> <code>TextView tvNav;</code>

<code>    </code><code>private</code> <code>String str = </code><code>""</code><code>;</code>

<code>    </code><code>private</code> <code>String strId = </code><code>""</code><code>;</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 标题栏textview 点击事件</code>

<code>     </code><code>* </code>

<code>     </code><code>* @author fei</code>

<code>     </code><code>*/</code>

<code>    </code><code>private</code> <code>final</code> <code>class</code> <code>TvClickListener </code><code>implements</code> <code>View.OnClickListener {</code>

<code>        </code><code>// private int index;</code>

<code>        </code><code>private</code> <code>TextView tvNav;</code>

<code>        </code><code>public</code> <code>TvClickListener(TextView tvNav) {</code>

<code>            </code><code>super</code><code>();</code>

<code>            </code><code>// this.index = index;</code>

<code>            </code><code>this</code><code>.tvNav = tvNav;</code>

<code>        </code><code>}</code>

<code>        </code><code>@Override</code>

<code>        </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>

<code>            </code><code>Boolean isclick = (Boolean) tvNav.getTag();</code>

<code>            </code><code>if</code> <code>(!isclick) {</code>

<code>                </code><code>tvNav.setBackgroundResource(R.anim.flag_0444);</code>

<code>                </code><code>tvNav.setTextColor(getResources().getColor(R.color.red));</code>

<code>                </code><code>tvNav.setTag(</code><code>true</code><code>);</code>

<code>                </code><code>// 显示到上面</code>

<code>                </code><code>str = str + tvNav.getText().toString() + </code><code>","</code><code>;</code>

<code>                </code><code>ed_en.setText(str);</code>

<code>                </code><code>// 记录Id</code>

<code>                </code><code>strId = strId + tvNav.getId() + </code><code>","</code><code>;</code>

<code>                </code><code>// strId = strId.substring(0, strId.length() - 1);</code>

<code>                </code><code>// MyLogUtil.v("传-&gt;strId", strId);</code>

<code>            </code><code>} </code><code>else</code> <code>{</code>

<code>                </code><code>tvNav.setBackgroundResource(R.anim.flag_022);</code>

<code>                </code><code>tvNav.setTextColor(getResources().getColor(R.color.gray));</code>

<code>                </code><code>tvNav.setTag(</code><code>false</code><code>);</code>

<code>                </code><code>str = str.replace(tvNav.getText().toString() + </code><code>","</code><code>, </code><code>""</code><code>);</code>

<code>                </code><code>strId = strId.replace(tvNav.getId() + </code><code>","</code><code>, </code><code>""</code><code>);</code>

<code>                </code><code>// MyLogUtil.v("Delete-&gt;strId", strId);</code>

<code>            </code><code>}</code>

<code>            </code><code>// ToastUtil.showToastLong(tvNav.getId() + ","</code>

<code>            </code><code>// + tvNav.getText().toString());</code>

    xml设置:

<code>     </code><code>&lt;LinearLayout</code>

<code>                    </code><code>android:layout_width=</code><code>"fill_parent"</code>

<code>                    </code><code>android:layout_height=</code><code>"wrap_content"</code>

<code>                    </code><code>android:layout_marginBottom=</code><code>"@dimen/dimens_10"</code>

<code>                    </code><code>android:layout_marginLeft=</code><code>"@dimen/x10"</code>

<code>                    </code><code>android:layout_marginRight=</code><code>"@dimen/x10"</code>

<code>                    </code><code>android:layout_marginTop=</code><code>"@dimen/y20"</code>

<code>                    </code><code>android:orientation=</code><code>"vertical"</code> <code>&gt;</code>

<code>                    </code><code>&lt;TextView</code>

<code>                        </code><code>android:layout_width=</code><code>"wrap_content"</code>

<code>                        </code><code>android:layout_height=</code><code>"wrap_content"</code>

<code>                        </code><code>android:drawableLeft=</code><code>"@drawable/biaoqian1"</code>

<code>                        </code><code>android:drawablePadding=</code><code>"@dimen/dimens_10"</code>

<code>                        </code><code>android:text=</code><code>"@string/bq3"</code>

<code>                        </code><code>android:textColor=</code><code>"@color/black"</code>

<code>                        </code><code>android:textSize=</code><code>"15sp"</code> <code>/&gt;</code>

<code>                    </code><code>&lt;com.kangxin.patient.utils.FlowLayout</code>

<code>                        </code><code>android:id=</code><code>"@+id/layou23"</code>

<code>                        </code><code>android:layout_width=</code><code>"fill_parent"</code>

<code>                        </code><code>android:layout_marginTop=</code><code>"@dimen/y10"</code>

<code>                        </code><code>android:orientation=</code><code>"vertical"</code> <code>&gt;</code>

<code>                    </code><code>&lt;/com.kangxin.patient.utils.FlowLayout&gt;</code>

<code>                </code><code>&lt;/LinearLayout&gt;</code>

    最后是自定义layout类FlowLayout:

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

<code>package</code> <code>com.zhy.zhy_flowlayout02;</code>

<code>import</code> <code>java.util.ArrayList;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>android.content.Context;</code>

<code>import</code> <code>android.util.AttributeSet;</code>

<code>import</code> <code>android.util.Log;</code>

<code>import</code> <code>android.view.View;</code>

<code>import</code> <code>android.view.ViewGroup;</code>

<code>public</code> <code>class</code> <code>FlowLayout </code><code>extends</code> <code>ViewGroup</code>

<code>{</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>String TAG = </code><code>"FlowLayout"</code><code>;</code>

<code>    </code><code>public</code> <code>FlowLayout(Context context, AttributeSet attrs)</code>

<code>    </code><code>{</code>

<code>        </code><code>super</code><code>(context, attrs);</code>

<code>    </code><code>@Override</code>

<code>    </code><code>protected</code> <code>ViewGroup.LayoutParams generateLayoutParams(</code>

<code>            </code><code>ViewGroup.LayoutParams p)</code>

<code>        </code><code>return</code> <code>new</code> <code>MarginLayoutParams(p);</code>

<code>    </code><code>public</code> <code>ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs)</code>

<code>        </code><code>return</code> <code>new</code> <code>MarginLayoutParams(getContext(), attrs);</code>

<code>    </code><code>protected</code> <code>ViewGroup.LayoutParams generateDefaultLayoutParams()</code>

<code>        </code><code>return</code> <code>new</code> <code>MarginLayoutParams(LayoutParams.MATCH_PARENT,</code>

<code>                </code><code>LayoutParams.MATCH_PARENT);</code>

<code>     </code><code>* 负责设置子控件的测量模式和大小 根据所有子控件设置自己的宽和高</code>

<code>    </code><code>protected</code> <code>void</code> <code>onMeasure(</code><code>int</code> <code>widthMeasureSpec, </code><code>int</code> <code>heightMeasureSpec)</code>

<code>        </code><code>super</code><code>.onMeasure(widthMeasureSpec, heightMeasureSpec);</code>

<code>        </code><code>// 获得它的父容器为它设置的测量模式和大小</code>

<code>        </code><code>int</code> <code>sizeWidth = MeasureSpec.getSize(widthMeasureSpec);</code>

<code>        </code><code>int</code> <code>sizeHeight = MeasureSpec.getSize(heightMeasureSpec);</code>

<code>        </code><code>int</code> <code>modeWidth = MeasureSpec.getMode(widthMeasureSpec);</code>

<code>        </code><code>int</code> <code>modeHeight = MeasureSpec.getMode(heightMeasureSpec);</code>

<code>        </code><code>Log.e(TAG, sizeWidth + </code><code>","</code> <code>+ sizeHeight);</code>

<code>        </code><code>// 如果是warp_content情况下,记录宽和高</code>

<code>        </code><code>int</code> <code>width = </code><code>0</code><code>;</code>

<code>        </code><code>int</code> <code>height = </code><code>0</code><code>;</code>

<code>        </code><code>/**</code>

<code>         </code><code>* 记录每一行的宽度,width不断取最大宽度</code>

<code>         </code><code>*/</code>

<code>        </code><code>int</code> <code>lineWidth = </code><code>0</code><code>;</code>

<code>         </code><code>* 每一行的高度,累加至height</code>

<code>        </code><code>int</code> <code>lineHeight = </code><code>0</code><code>;</code>

<code>        </code><code>int</code> <code>cCount = getChildCount();</code>

<code>        </code><code>// 遍历每个子元素</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; cCount; i++)</code>

<code>        </code><code>{</code>

<code>            </code><code>View child = getChildAt(i);</code>

<code>            </code><code>// 测量每一个child的宽和高</code>

<code>            </code><code>measureChild(child, widthMeasureSpec, heightMeasureSpec);</code>

<code>            </code><code>// 得到child的lp</code>

<code>            </code><code>MarginLayoutParams lp = (MarginLayoutParams) child</code>

<code>                    </code><code>.getLayoutParams();</code>

<code>            </code><code>// 当前子空间实际占据的宽度</code>

<code>            </code><code>int</code> <code>childWidth = child.getMeasuredWidth() + lp.leftMargin</code>

<code>                    </code><code>+ lp.rightMargin;</code>

<code>            </code><code>// 当前子空间实际占据的高度</code>

<code>            </code><code>int</code> <code>childHeight = child.getMeasuredHeight() + lp.topMargin</code>

<code>                    </code><code>+ lp.bottomMargin;</code>

<code>            </code><code>/**</code>

<code>             </code><code>* 如果加入当前child,则超出最大宽度,则的到目前最大宽度给width,类加height 然后开启新行</code>

<code>             </code><code>*/</code>

<code>            </code><code>if</code> <code>(lineWidth + childWidth &gt; sizeWidth)</code>

<code>            </code><code>{</code>

<code>                </code><code>width = Math.max(lineWidth, childWidth);</code><code>// 取最大的</code>

<code>                </code><code>lineWidth = childWidth; </code><code>// 重新开启新行,开始记录</code>

<code>                </code><code>// 叠加当前高度,</code>

<code>                </code><code>height += lineHeight;</code>

<code>                </code><code>// 开启记录下一行的高度</code>

<code>                </code><code>lineHeight = childHeight;</code>

<code>            </code><code>} </code><code>else</code>

<code>            </code><code>// 否则累加值lineWidth,lineHeight取最大高度</code>

<code>                </code><code>lineWidth += childWidth;</code>

<code>                </code><code>lineHeight = Math.max(lineHeight, childHeight);</code>

<code>            </code><code>// 如果是最后一个,则将当前记录的最大宽度和当前lineWidth做比较</code>

<code>            </code><code>if</code> <code>(i == cCount - </code><code>1</code><code>)</code>

<code>                </code><code>width = Math.max(width, lineWidth);</code>

<code>        </code><code>setMeasuredDimension((modeWidth == MeasureSpec.EXACTLY) ? sizeWidth</code>

<code>                </code><code>: width, (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight</code>

<code>                </code><code>: height);</code>

<code>     </code><code>* 存储所有的View,按行记录</code>

<code>    </code><code>private</code> <code>List&lt;List&lt;View&gt;&gt; mAllViews = </code><code>new</code> <code>ArrayList&lt;List&lt;View&gt;&gt;();</code>

<code>     </code><code>* 记录每一行的最大高度</code>

<code>    </code><code>private</code> <code>List&lt;Integer&gt; mLineHeight = </code><code>new</code> <code>ArrayList&lt;Integer&gt;();</code>

<code>    </code><code>protected</code> <code>void</code> <code>onLayout(</code><code>boolean</code> <code>changed, </code><code>int</code> <code>l, </code><code>int</code> <code>t, </code><code>int</code> <code>r, </code><code>int</code> <code>b)</code>

<code>        </code><code>mAllViews.clear();</code>

<code>        </code><code>mLineHeight.clear();</code>

<code>        </code><code>int</code> <code>width = getWidth();</code>

<code>        </code><code>// 存储每一行所有的childView</code>

<code>        </code><code>List&lt;View&gt; lineViews = </code><code>new</code> <code>ArrayList&lt;View&gt;();</code>

<code>        </code><code>// 遍历所有的孩子</code>

<code>            </code><code>int</code> <code>childWidth = child.getMeasuredWidth();</code>

<code>            </code><code>int</code> <code>childHeight = child.getMeasuredHeight();</code>

<code>            </code><code>// 如果已经需要换行</code>

<code>            </code><code>if</code> <code>(childWidth + lp.leftMargin + lp.rightMargin + lineWidth &gt; width)</code>

<code>                </code><code>// 记录这一行所有的View以及最大高度</code>

<code>                </code><code>mLineHeight.add(lineHeight);</code>

<code>                </code><code>// 将当前行的childView保存,然后开启新的ArrayList保存下一行的childView</code>

<code>                </code><code>mAllViews.add(lineViews);</code>

<code>                </code><code>lineWidth = </code><code>0</code><code>;</code><code>// 重置行宽</code>

<code>                </code><code>lineViews = </code><code>new</code> <code>ArrayList&lt;View&gt;();</code>

<code>             </code><code>* 如果不需要换行,则累加</code>

<code>            </code><code>lineWidth += childWidth + lp.leftMargin + lp.rightMargin;</code>

<code>            </code><code>lineHeight = Math.max(lineHeight, childHeight + lp.topMargin</code>

<code>                    </code><code>+ lp.bottomMargin);</code>

<code>            </code><code>lineViews.add(child);</code>

<code>        </code><code>// 记录最后一行</code>

<code>        </code><code>mLineHeight.add(lineHeight);</code>

<code>        </code><code>mAllViews.add(lineViews);</code>

<code>        </code><code>int</code> <code>left = </code><code>0</code><code>;</code>

<code>        </code><code>int</code> <code>top = </code><code>0</code><code>;</code>

<code>        </code><code>// 得到总行数</code>

<code>        </code><code>int</code> <code>lineNums = mAllViews.size();</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; lineNums; i++)</code>

<code>            </code><code>// 每一行的所有的views</code>

<code>            </code><code>lineViews = mAllViews.get(i);</code>

<code>            </code><code>// 当前行的最大高度</code>

<code>            </code><code>lineHeight = mLineHeight.get(i);</code>

<code>            </code><code>Log.e(TAG, </code><code>"第"</code> <code>+ i + </code><code>"行 :"</code> <code>+ lineViews.size() + </code><code>" , "</code> <code>+ lineViews);</code>

<code>            </code><code>Log.e(TAG, </code><code>"第"</code> <code>+ i + </code><code>"行, :"</code> <code>+ lineHeight);</code>

<code>            </code><code>// 遍历当前行所有的View</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>j = </code><code>0</code><code>; j &lt; lineViews.size(); j++)</code>

<code>                </code><code>View child = lineViews.get(j);</code>

<code>                </code><code>if</code> <code>(child.getVisibility() == View.GONE)</code>

<code>                </code><code>{</code>

<code>                    </code><code>continue</code><code>;</code>

<code>                </code><code>}</code>

<code>                </code><code>MarginLayoutParams lp = (MarginLayoutParams) child</code>

<code>                        </code><code>.getLayoutParams();</code>

<code>                </code><code>//计算childView的left,top,right,bottom</code>

<code>                </code><code>int</code> <code>lc = left + lp.leftMargin;</code>

<code>                </code><code>int</code> <code>tc = top + lp.topMargin;</code>

<code>                </code><code>int</code> <code>rc =lc + child.getMeasuredWidth();</code>

<code>                </code><code>int</code> <code>bc = tc + child.getMeasuredHeight();</code>

<code>                </code><code>Log.e(TAG, child + </code><code>" , l = "</code> <code>+ lc + </code><code>" , t = "</code> <code>+ t + </code><code>" , r ="</code>

<code>                        </code><code>+ rc + </code><code>" , b = "</code> <code>+ bc);</code>

<code>                </code><code>child.layout(lc, tc, rc, bc);</code>

<code>                </code> 

<code>                </code><code>left += child.getMeasuredWidth() + lp.rightMargin</code>

<code>                        </code><code>+ lp.leftMargin;</code>

<code>            </code><code>left = </code><code>0</code><code>;</code>

<code>            </code><code>top += lineHeight;</code>

<code>}</code>

本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1663535,如需转载请自行联系原作者

继续阅读