android仿iPhone滚轮控件实现及源码分析二.docx
- 文档编号:6460565
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:49
- 大小:33.87KB
android仿iPhone滚轮控件实现及源码分析二.docx
《android仿iPhone滚轮控件实现及源码分析二.docx》由会员分享,可在线阅读,更多相关《android仿iPhone滚轮控件实现及源码分析二.docx(49页珍藏版)》请在冰豆网上搜索。
android仿iPhone滚轮控件实现及源码分析二
android仿iPhone滚轮控件实现及源码分析
(二)
在上一篇android仿iPhone滚轮控件实现及源码分析
(一)简单的说了下架构还有效果图,但是关于图形的绘制各方面的代码在532行到940行,如果写在一篇文章里面,可能会导致文章太长,效果不好,所以自作聪明的分成了两篇
。
闲言碎语不要讲,下面开始正事。
首先,先把代码贴出来:
[java]viewplaincopyprint?
1./**
2. * Calculates control width and creates text layouts
3. * @param widthSize the input layout width
4. * @param mode the layout mode
5. * @return the calculated control width
6. */
7. private int calculateLayoutWidth(int widthSize, int mode) {
8. initResourcesIfNecessary();
9.
10. int width = widthSize;
11. int maxLength = getMaxTextLength();
12. if (maxLength > 0) {
13. float textWidth = FloatMath.ceil(Layout.getDesiredWidth("0", itemsPaint));
14. itemsWidth = (int) (maxLength * textWidth);
15. } else {
16. itemsWidth = 0;
17. }
18. itemsWidth += ADDITIONAL_ITEMS_SPACE; // make it some more
19.
20. labelWidth = 0;
21. if (label !
= null && label.length() > 0) {
22. labelWidth = (int) FloatMath.ceil(Layout.getDesiredWidth(label, valuePaint));
23. }
24.
25. boolean recalculate = false;
26. if (mode == MeasureSpec.EXACTLY) {
27. width = widthSize;
28. recalculate = true;
29. } else {
30. width = itemsWidth + labelWidth + 2 * PADDING;
31. if (labelWidth > 0) {
32. width += LABEL_OFFSET;
33. }
34.
35. // Check against our minimum width
36. width = Math.max(width, getSuggestedMinimumWidth());
37.
38. if (mode == MeasureSpec.AT_MOST && widthSize < width) {
39. width = widthSize;
40. recalculate = true;
41. }
42. }
43.
44. if (recalculate) {
45. // recalculate width
46. int pureWidth = width - LABEL_OFFSET - 2 * PADDING;
47. if (pureWidth <= 0) {
48. itemsWidth = labelWidth = 0;
49. }
50. if (labelWidth > 0) {
51. double newWidthItems = (double) itemsWidth * pureWidth
52. / (itemsWidth + labelWidth);
53. itemsWidth = (int) newWidthItems;
54. labelWidth = pureWidth - itemsWidth;
55. } else {
56. itemsWidth = pureWidth + LABEL_OFFSET; // no label
57. }
58. }
59.
60. if (itemsWidth > 0) {
61. createLayouts(itemsWidth, labelWidth);
62. }
63.
64. return width;
65. }
66.
67. /**
68. * Creates layouts
69. * @param widthItems width of items layout
70. * @param widthLabel width of label layout
71. */
72. private void createLayouts(int widthItems, int widthLabel) {
73. if (itemsLayout == null || itemsLayout.getWidth() > widthItems) {
74. itemsLayout = new StaticLayout(buildText(isScrollingPerformed), itemsPaint, widthItems,
75. widthLabel > 0 ?
Layout.Alignment.ALIGN_OPPOSITE :
Layout.Alignment.ALIGN_CENTER,
76. 1, ADDITIONAL_ITEM_HEIGHT, false);
77. } else {
78. itemsLayout.increaseWidthTo(widthItems);
79. }
80.
81. if (!
isScrollingPerformed && (valueLayout == null || valueLayout.getWidth() > widthItems)) {
82. String text = getAdapter() !
= null ?
getAdapter().getItem(currentItem) :
null;
83. valueLayout = new StaticLayout(text !
= null ?
text :
"",
84. valuePaint, widthItems, widthLabel > 0 ?
85. Layout.Alignment.ALIGN_OPPOSITE :
Layout.Alignment.ALIGN_CENTER,
86. 1, ADDITIONAL_ITEM_HEIGHT, false);
87. } else if (isScrollingPerformed) {
88. valueLayout = null;
89. } else {
90. valueLayout.increaseWidthTo(widthItems);
91. }
92.
93. if (widthLabel > 0) {
94. if (labelLayout == null || labelLayout.getWidth() > widthLabel) {
95. labelLayout = new StaticLayout(label, valuePaint,
96. widthLabel, Layout.Alignment.ALIGN_NORMAL, 1,
97. ADDITIONAL_ITEM_HEIGHT, false);
98. } else {
99. labelLayout.increaseWidthTo(widthLabel);
100. }
101. }
102. }
103.
104. @Override
105. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
106. int widthMode = MeasureSpec.getMode(widthMeasureSpec);
107. int heightMode = MeasureSpec.getMode(heightMeasureSpec);
108. int widthSize = MeasureSpec.getSize(widthMeasureSpec);
109. int heightSize = MeasureSpec.getSize(heightMeasureSpec);
110.
111. int width = calculateLayoutWidth(widthSize, widthMode);
112.
113. int height;
114. if (heightMode == MeasureSpec.EXACTLY) {
115. height = heightSize;
116. } else {
117. height = getDesiredHeight(itemsLayout);
118.
119. if (heightMode == MeasureSpec.AT_MOST) {
120. height = Math.min(height, heightSize);
121. }
122. }
123.
124. setMeasuredDimension(width, height);
125. }
126.
127. @Override
128. protected void onDraw(Canvas canvas) {
129. super.onDraw(canvas);
130.
131. if (itemsLayout == null) {
132. if (itemsWidth == 0) {
133. calculateLayoutWidth(getWidth(), MeasureSpec.EXACTLY);
134. } else {
135. createLayouts(itemsWidth, labelWidth);
136. }
137. }
138.
139. if (itemsWidth > 0) {
140. canvas.save();
141. // Skip padding space and hide a part of top and bottom items
142. canvas.translate(PADDING, -ITEM_OFFSET);
143. drawItems(canvas);
144. drawValue(canvas);
145. canvas.restore();
146. }
147.
148. drawCenterRect(canvas);
149. drawShadows(canvas);
150. }
151.
152. /**
153. * Draws shadows on top and bottom of control
154. * @param canvas the canvas for drawing
155. */
156. private void drawShadows(Canvas canvas) {
157. topShadow.setBounds(0, 0, getWidth(), getHeight() / visibleItems);
158. topShadow.draw(canvas);
159.
160. bottomShadow.setBounds(0, getHeight() - getHeight() / visibleItems,
161. getWidth(), getHeight());
162. bottomShadow.draw(canvas);
163. }
164.
165. /**
166. * Draws value and label layout
167. * @param canvas the canvas for drawing
168. */
169. private void drawValue(Canvas canvas) {
170. valuePaint.setColor(VALUE_TEXT_COLOR);
171. valuePaint.drawableState = getDrawableState();
172.
173. Rect bounds = new Rect();
174. itemsLayout.getLineBounds(visibleItems / 2, bounds);
175.
176. // draw label
177. if (labelLayout !
= null) {
178. canvas.save();
179. canvas.translate(itemsLayout.getWidth() + LABEL_OFFSET, bounds.top);
180. labelLayout.draw(canvas);
181. canvas.restore();
182. }
183.
184. // draw current value
185. if (valueLayout !
= null) {
186. canvas.save();
187. canvas.translate(0, bounds.top + scrollingOffset);
188. valueLayout.draw(canvas);
189. canvas.restore();
190. }
191. }
192.
193. /**
194. * Draws items
195. * @param canvas the canvas for drawing
196. */
197. private void drawItems(Canvas canvas) {
198. canvas.save();
199.
200. int top = itemsLayout.getLineTop
(1);
201. canvas.translate(0, - top + scrollingOffset);
202.
203. itemsPaint.setColor(ITEMS_TEXT_COLOR);
204. itemsPaint.drawableState = getDrawableState();
205. itemsLayout.draw(canvas);
206.
207. canvas.restore();
208. }
209.
210. /**
211. * Draws rect for current value
212. * @param canvas the canvas for drawing
213. */
214. private void drawCenterRect(Canvas canvas) {
215. int center = getHeight() / 2;
216. int offset = getItemHeight() / 2;
217. centerDrawable.setBounds(0, center - offset, getWidth(), center + offset);
218. centerDrawable.draw(canvas);
219. }
220.
221. @Override
222. public boolean onTouchEvent(MotionEvent event) {
223. WheelAdapter adapter = getAdapter();
224. if (adapter == null) {
225. return true;
226. }
227.
228. if (!
gestureDetector.onTouchEvent(event) && event.getAction() == MotionEvent.ACTION_UP) {
229. justify();
230. }
231. return true;
232. }
233.
234. /**
235. * Scrolls the wheel
236. * @param delta the scrolling value
237. */
238. private void doScroll(int delta) {
239. scrollingOffset += delta;
240.
241. int count = scrollingOffset / getItemHeight();
242. int pos = currentItem - count;
243. if (isCyclic && adapter.g
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android iPhone 滚轮 控件 实现 源码 分析