Android 日历方式显示的日期选择组件
此Widget组件只包含五个类文件:
• DateWidget
• DateWidgetDayCell
• DateWidgetDayHeader
• DayStyle
• SymbolButton
*红色为启动的activity
DateWidget.java:
Java代码
1. package com.iaiai;
2.
3. import java.text.SimpleDateFormat;
4. import java.util.ArrayList;
5. import java.util.Calendar;
6.
7. import android.app.Activity;
8. import android.os.Bundle;
9. import android.view.Gravity;
10. import android.view.View;
11. import android.widget.Button;
12. import android.widget.LinearLayout;
13. import android.widget.LinearLayout.LayoutParams; 14. import android.widget.TextView;
15.
37. public class DateWidget extends Activity { 38. private ArrayList days = new ArrayList();
39. // private SimpleDateFormat dateMonth = new SimpleDateFormat("MMMM yyyy");
40. private Calendar calStartDate = Calendar.getInstance(); 41. private Calendar calToday = Calendar.getInstance(); 42. private Calendar calCalendar = Calendar.getInstance(); 43. private Calendar calSelected = Calendar.getInstance(); 44. LinearLayout layContent = null;
45. Button btnPrev = null;
46. Button btnToday = null;
47. Button btnNext = null;
48. private int iFirstDayOfWeek = Calendar.MONDAY; 49. private int iMonthViewCurrentMonth = 0; 50. private int iMonthViewCurrentYear = 0; 51. public static final int SELECT_DATE_REQUEST = 111; 52. private static final int iDayCellSize = 38; 53. private static final int iDayHeaderHeight = 24; 1
54. private static final int iTotalWidth = (iDayCellSize * 7); 55. private TextView tv;
56. private int mYear;
57. private int mMonth;
58. private int mDay;
59.
60. @Override
61. public void onCreate(Bundle icicle) {
62. super.onCreate(icicle);
63. iFirstDayOfWeek = Calendar.MONDAY;
64. mYear = calSelected.get(Calendar.YEAR); 65. mMonth = calSelected.get(Calendar.MONTH); 66. mDay = calSelected.get(Calendar.DAY_OF_MONTH); 67. setContentView(generateContentView()); 68. calStartDate = getCalendarStartDate(); 69. DateWidgetDayCell daySelected = updateCalendar(); 70. updateControlsState();
71. if (daySelected != null)
72. daySelected.requestFocus();
73. }
74.
75. @Override
76. public void onStart() {
77. super.onStart();
78.
79. }
80.
81. private LinearLayout createLayout(int iOrientation) { 82. LinearLayout lay = new LinearLayout(this); 83. lay.setLayoutParams(new LayoutParams( 84. android.view.ViewGroup.LayoutParams.FILL_PARENT, 85. android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); 86. lay.setOrientation(iOrientation);
87. return lay;
88. }
89.
90. private Button createButton(String sText, int iWidth, int iHeight) {
91. Button btn = new Button(this);
92. btn.setText(sText);
93. btn.setLayoutParams(new LayoutParams(iWidth, iHeight)); 94. return btn;
95. }
96.
97. private void generateTopButtons(LinearLayout layTopControls) { 2
98. final int iHorPadding = 24;
99. final int iSmallButtonWidth = 60;
100. btnToday = createButton("", iTotalWidth - iSmallButtonWidth 101. - iSmallButtonWidth,
102. android.view.ViewGroup.LayoutParams.WRAP_CONTENT); 103. btnToday.setPadding(iHorPadding, btnToday.getPaddingTop(), iHorPadding, 104. btnToday.getPaddingBottom());
105. btnToday.setBackgroundResource(android.R.drawable.btn_default_small); 106.
107. SymbolButton btnPrev = new SymbolButton(this, 108. SymbolButton.symbol.arrowLeft);
109. btnPrev.setLayoutParams(new LayoutParams(iSmallButtonWidth, 110. android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); 111. btnPrev.setBackgroundResource(android.R.drawable.btn_default_small); 112.
113. SymbolButton btnNext = new SymbolButton(this, 114. SymbolButton.symbol.arrowRight);
115. btnNext.setLayoutParams(new LayoutParams(iSmallButtonWidth, 116. android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); 117. btnNext.setBackgroundResource(android.R.drawable.btn_default_small); 118.
119. // set events
120. btnPrev.setOnClickListener(new Button.OnClickListener() { 121. public void onClick(View arg0) {
122. setPrevViewItem();
123. }
124. });
125. btnToday.setOnClickListener(new Button.OnClickListener() { 126. public void onClick(View arg0) {
127.
128. setTodayViewItem();
129. String s = calToday.get(Calendar.YEAR) + "/" 130. + (calToday.get(Calendar.MONTH) + 1); 131. btnToday.setText(s);
132. }
133. });
134. btnNext.setOnClickListener(new Button.OnClickListener() { 135. public void onClick(View arg0) {
136. setNextViewItem();
137. }
138. });
139.
140. layTopControls.setGravity(Gravity.CENTER_HORIZONTAL); 141. layTopControls.addView(btnPrev);
3
142. layTopControls.addView(btnToday);
143. layTopControls.addView(btnNext);
144. }
145.
146. private View generateContentView() {
147. LinearLayout layMain = createLayout(LinearLayout.VERTICAL); 148. layMain.setPadding(8, 8, 8, 8);
149. LinearLayout layTopControls = createLayout(LinearLayout.HORIZONTAL);
150.
151. layContent = createLayout(LinearLayout.VERTICAL); 152. layContent.setPadding(20, 0, 20, 0); 153. generateTopButtons(layTopControls);
154. generateCalendar(layContent);
155. layMain.addView(layTopControls);
156. layMain.addView(layContent);
157.
158. tv = new TextView(this);
159. layMain.addView(tv);
160. return layMain;
161. }
162.
163. private View generateCalendarRow() {
164. LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL); 165. for (int iDay = 0; iDay < 7; iDay++) { 166. DateWidgetDayCell dayCell = new DateWidgetDayCell(this, 167. iDayCellSize, iDayCellSize); 168. dayCell.setItemClick(mOnDayCellClick); 169. days.add(dayCell);
170. layRow.addView(dayCell);
171. }
172. return layRow;
173. }
174.
175. private View generateCalendarHeader() {
176. LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL); 177. for (int iDay = 0; iDay < 7; iDay++) { 178. DateWidgetDayHeader day = new DateWidgetDayHeader(this, 179. iDayCellSize, iDayHeaderHeight); 180. final int iWeekDay = DayStyle.getWeekDay(iDay, iFirstDayOfWeek);
181. day.setData(iWeekDay);
182. layRow.addView(day);
183. }
184. return layRow;
185. }
4
186.
187. private void generateCalendar(LinearLayout layContent) { 188. layContent.addView(generateCalendarHeader()); 189. days.clear();
190. for (int iRow = 0; iRow < 6; iRow++) {
191. layContent.addView(generateCalendarRow()); 192. }
193. }
194.
195. private Calendar getCalendarStartDate() {
196. calToday.setTimeInMillis(System.currentTimeMillis()); 197. calToday.setFirstDayOfWeek(iFirstDayOfWeek); 198.
199. if (calSelected.getTimeInMillis() == 0) {
200. calStartDate.setTimeInMillis(System.currentTimeMillis()); 201. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek); 202. } else {
203. calStartDate.setTimeInMillis(calSelected.getTimeInMillis()); 204. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek); 205. }
206.
207. UpdateStartDateForMonth();
208.
209. return calStartDate;
210. }
211.
212. private DateWidgetDayCell updateCalendar() {
213. DateWidgetDayCell daySelected = null;
214. boolean bSelected = false;
215. final boolean bIsSelection = (calSelected.getTimeInMillis() != 0); 216. final int iSelectedYear = calSelected.get(Calendar.YEAR); 217. final int iSelectedMonth = calSelected.get(Calendar.MONTH); 218. final int iSelectedDay = calSelected.get(Calendar.DAY_OF_MONTH); 219. calCalendar.setTimeInMillis(calStartDate.getTimeInMillis()); 220. for (int i = 0; i < days.size(); i++) {
221. final int iYear = calCalendar.get(Calendar.YEAR); 222. final int iMonth = calCalendar.get(Calendar.MONTH); 223. final int iDay = calCalendar.get(Calendar.DAY_OF_MONTH); 224. final int iDayOfWeek = calCalendar.get(Calendar.DAY_OF_WEEK); 225. DateWidgetDayCell dayCell = days.get(i); 226. // check today
227. boolean bToday = false;
228. if (calToday.get(Calendar.YEAR) == iYear) 229. if (calToday.get(Calendar.MONTH) == iMonth) 5
230. if (calToday.get(Calendar.DAY_OF_MONTH) == iDay) 231. bToday = true;
232. // check holiday
233. boolean bHoliday = false;
234. if ((iDayOfWeek == Calendar.SATURDAY) 235. || (iDayOfWeek == Calendar.SUNDAY)) 236. bHoliday = true;
237. if ((iMonth == Calendar.JANUARY) && (iDay == 1)) 238. bHoliday = true;
239.
240. dayCell.setData(iYear, iMonth, iDay, bToday, bHoliday, 241. iMonthViewCurrentMonth);
242. bSelected = false;
243. if (bIsSelection)
244. if ((iSelectedDay == iDay) && (iSelectedMonth == iMonth) 245. && (iSelectedYear == iYear)) { 246. bSelected = true;
247. }
248. dayCell.setSelected(bSelected);
249. if (bSelected)
250. daySelected = dayCell;
251. calCalendar.add(Calendar.DAY_OF_MONTH, 1); 252. }
253. layContent.invalidate();
254. return daySelected;
255. }
256.
257. private void UpdateStartDateForMonth() {
258. iMonthViewCurrentMonth = calStartDate.get(Calendar.MONTH); 259. iMonthViewCurrentYear = calStartDate.get(Calendar.YEAR); 260. calStartDate.set(Calendar.DAY_OF_MONTH, 1); 261. UpdateCurrentMonthDisplay();
262. // update days for week
263. int iDay = 0;
264. int iStartDay = iFirstDayOfWeek;
265. if (iStartDay == Calendar.MONDAY) {
266. iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY;
267. if (iDay < 0)
268. iDay = 6;
269. }
270. if (iStartDay == Calendar.SUNDAY) {
271. iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
272. if (iDay < 0)
273. iDay = 6;
6
274. }
275. calStartDate.add(Calendar.DAY_OF_WEEK, -iDay); 276. }
277.
278. private void UpdateCurrentMonthDisplay() { 279. String s = calCalendar.get(Calendar.YEAR) + "/" 280. + (calCalendar.get(Calendar.MONTH) + 1);// dateMonth.format(calCalendar.getTime());
281. btnToday.setText(s);
282. mYear = calCalendar.get(Calendar.YEAR); 283. }
284.
285. private void setPrevViewItem() {
286. iMonthViewCurrentMonth--;
287. if (iMonthViewCurrentMonth == -1) {
288. iMonthViewCurrentMonth = 11;
289. iMonthViewCurrentYear--;
290. }
291. calStartDate.set(Calendar.DAY_OF_MONTH, 1); 292. calStartDate.set(Calendar.MONTH, iMonthViewCurrentMonth); 293. calStartDate.set(Calendar.YEAR, iMonthViewCurrentYear); 294. UpdateStartDateForMonth();
295. updateCalendar();
296.
297. }
298.
299. private void setTodayViewItem() {
300. calToday.setTimeInMillis(System.currentTimeMillis()); 301. calToday.setFirstDayOfWeek(iFirstDayOfWeek); 302. calStartDate.setTimeInMillis(calToday.getTimeInMillis()); 303. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek); 304. UpdateStartDateForMonth();
305. updateCalendar();
306. }
307.
308. private void setNextViewItem() {
309. iMonthViewCurrentMonth++;
310. if (iMonthViewCurrentMonth == 12) {
311. iMonthViewCurrentMonth = 0;
312. iMonthViewCurrentYear++;
313. }
314. calStartDate.set(Calendar.DAY_OF_MONTH, 1); 315. calStartDate.set(Calendar.MONTH, iMonthViewCurrentMonth); 316. calStartDate.set(Calendar.YEAR, iMonthViewCurrentYear); 7
317. UpdateStartDateForMonth();
318. updateCalendar();
319.
320. }
321.
322. private DateWidgetDayCell.OnItemClick mOnDayCellClick = new DateWidgetDayCell.OnItemClick() {
323. public void OnClick(DateWidgetDayCell item) { 324. calSelected.setTimeInMillis(item.getDate().getTimeInMillis());
325. item.setSelected(true);
326. updateCalendar();
327. updateControlsState();
328. }
329. };
330.
331. private void updateControlsState() {
332. SimpleDateFormat dateFull = new SimpleDateFormat("d MMMM yyyy");
333. mYear = calSelected.get(Calendar.YEAR); 334. mMonth = calSelected.get(Calendar.MONTH); 335. mDay = calSelected.get(Calendar.DAY_OF_MONTH); 336. tv.setText(new StringBuilder().append(mYear).append("/") 337. .append(format(mMonth + 1)).append("/").append(format(mDay))
338. .append("-----").append(dateFull.format(calSelected.getTime())));
339. }
340.
341. private String format(int x) {
342. String s = "" + x;
343. if (s.length() == 1)
344. s = "0" + s;
345. return s;
346. }
347.
348. }
DateWidgetDayCell.java:
Java代码
1. package com.iaiai;
2.
3. import java.util.Calendar;
4.
5. import android.content.Context;
6. import android.graphics.Canvas;
7. import android.graphics.LinearGradient;
8. import android.graphics.Paint;
8
9. import android.graphics.Rect;
10. import android.graphics.RectF;
11. import android.graphics.Shader;
12. import android.view.KeyEvent;
13. import android.view.MotionEvent;
14. import android.view.View;
15. import android.view.animation.AlphaAnimation; 16. import android.widget.LinearLayout.LayoutParams; 17.
39. public class DateWidgetDayCell extends View { 40. // types
41. public interface OnItemClick {
42. public void OnClick(DateWidgetDayCell item); 43. }
44.
45. public static int ANIM_ALPHA_DURATION = 100; 46. // fields
47. private final static float fTextSize = 22; 48. private final static int iMargin = 1; 49. private final static int iAlphaInactiveMonth = 0x88;
50.
51. // fields
52. private int iDateYear = 0;
53. private int iDateMonth = 0;
54. private int iDateDay = 0;
55.
56. // fields
57. private OnItemClick itemClick = null; 58. private Paint pt = new Paint(); 59. private RectF rect = new RectF(); 60. private String sDate = "";
61.
62. // fields
63. private boolean bSelected = false; 64. private boolean bIsActiveMonth = false; 65. private boolean bToday = false; 66. private boolean bHoliday = false; 67. private boolean bTouchedDown = false; 68.
69. // methods
70. public DateWidgetDayCell(Context context, int iWidth, int iHeight) {
71. super(context);
72. setFocusable(true);
73. setLayoutParams(new LayoutParams(iWidth, iHeight));
9
74. }
75.
76. public boolean getSelected() {
77. return this.bSelected;
78. }
79.
80. @Override
81. public void setSelected(boolean bEnable) { 82. if (this.bSelected != bEnable) {
83. this.bSelected = bEnable;
84. this.invalidate();
85. }
86. }
87.
88. public void setData(int iYear, int iMonth, int iDay, boolean bToday,
89. boolean bHoliday, int iActiveMonth) { 90. iDateYear = iYear;
91. iDateMonth = iMonth;
92. iDateDay = iDay;
93.
94. this.sDate = Integer.toString(iDateDay); 95. this.bIsActiveMonth = (iDateMonth == iActiveMonth); 96. this.bToday = bToday;
97. this.bHoliday = bHoliday;
98. }
99.
100. public void setItemClick(OnItemClick itemClick) { 101. this.itemClick = itemClick;
102. }
103.
104. private int getTextHeight() {
105. return (int) (-pt.ascent() + pt.descent()); 106. }
107.
108. @Override
109. public boolean onKeyDown(int keyCode, KeyEvent event) { 110. boolean bResult = super.onKeyDown(keyCode, event); 111. if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) 112. || (keyCode == KeyEvent.KEYCODE_ENTER)) { 113. doItemClick();
114. }
115. return bResult;
116. }
117.
10
118. @Override
119. public boolean onKeyUp(int keyCode, KeyEvent event) { 120. boolean bResult = super.onKeyUp(keyCode, event); 121. return bResult;
122. }
123.
124. public void doItemClick() {
125. if (itemClick != null)
126. itemClick.OnClick(this);
127. }
128.
129. @Override
130. protected void onFocusChanged(boolean gainFocus, int direction,
131. Rect previouslyFocusedRect) { 132. super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
133. invalidate();
134. }
135.
136. public Calendar getDate() {
137. Calendar calDate = Calendar.getInstance(); 138. calDate.clear();
139. calDate.set(Calendar.YEAR, iDateYear); 140. calDate.set(Calendar.MONTH, iDateMonth); 141. calDate.set(Calendar.DAY_OF_MONTH, iDateDay); 142. return calDate;
143. }
144.
145. @Override
146. protected void onDraw(Canvas canvas) { 147. super.onDraw(canvas);
148.
149. // init rectangles
150. rect.set(0, 0, this.getWidth(), this.getHeight()); 151. rect.inset(1, 1);
152.
153. // drawing
154. final boolean bFocused = IsViewFocused(); 155.
156. drawDayView(canvas, bFocused);
157. drawDayNumber(canvas, bFocused); 158. }
159.
160. private void drawDayView(Canvas canvas, boolean bFocused) {
161. if (bSelected || bFocused) {
11
162. LinearGradient lGradBkg = null;
163.
164. if (bFocused) {
165. lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0, 166. DayStyle.iColorBkgFocusDark, 167. DayStyle.iColorBkgFocusLight, Shader.TileMode.CLAMP); 168. }
169.
170. if (bSelected) {
171. lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0, 172. DayStyle.iColorBkgSelectedDark, 173. DayStyle.iColorBkgSelectedLight, Shader.TileMode.CLAMP);
174. }
175.
176. if (lGradBkg != null) {
177. pt.setShader(lGradBkg);
178. canvas.drawRect(rect, pt);
179. }
180.
181. pt.setShader(null);
182.
183. } else {
184.
185. pt.setColor(DayStyle.getColorBkg(bHoliday, bToday)); 186. if (!bIsActiveMonth)
187. pt.setAlpha(iAlphaInactiveMonth);
188. canvas.drawRect(rect, pt);
189. }
190. }
191.
192. public void drawDayNumber(Canvas canvas, boolean bFocused) { 193. // draw day number
194. pt.setTypeface(null);
195. pt.setAntiAlias(true);
196. pt.setShader(null);
197. pt.setFakeBoldText(true);
198. pt.setTextSize(fTextSize);
199.
200. pt.setUnderlineText(false);
201. if (bToday)
202. pt.setUnderlineText(true);
203.
204. int iTextPosX = (int) rect.right - (int) pt.measureText(sDate); 205. int iTextPosY = (int) rect.bottom + (int) (-pt.ascent()) 12
206. - getTextHeight();
207.
208. iTextPosX -= ((int) rect.width() >> 1) 209. - ((int) pt.measureText(sDate) >> 1); 210. iTextPosY -= ((int) rect.height() >> 1) - (getTextHeight() >> 1);
211.
212. // draw text
213. if (bSelected || bFocused) {
214. if (bSelected)
215. pt.setColor(DayStyle.iColorTextSelected); 216. if (bFocused)
217. pt.setColor(DayStyle.iColorTextFocused); 218. } else {
219. pt.setColor(DayStyle.getColorText(bHoliday, bToday)); 220. }
221.
222. if (!bIsActiveMonth)
223. pt.setAlpha(iAlphaInactiveMonth); 224.
225. canvas.drawText(sDate, iTextPosX, iTextPosY + iMargin, pt); 226.
227. pt.setUnderlineText(false);
228. }
229.
230. public boolean IsViewFocused() {
231. return (this.isFocused() || bTouchedDown); 232. }
233.
234. @Override
235. public boolean onTouchEvent(MotionEvent event) { 236. boolean bHandled = false;
237. if (event.getAction() == MotionEvent.ACTION_DOWN) { 238. bHandled = true;
239. bTouchedDown = true;
240. invalidate();
241. startAlphaAnimIn(DateWidgetDayCell.this); 242. }
243. if (event.getAction() == MotionEvent.ACTION_CANCEL) { 244. bHandled = true;
245. bTouchedDown = false;
246. invalidate();
247. }
248. if (event.getAction() == MotionEvent.ACTION_UP) { 249. bHandled = true;
13
250. bTouchedDown = false;
251. invalidate();
252. doItemClick();
253. }
254. return bHandled;
255. }
256.
257. public static void startAlphaAnimIn(View view) { 258. AlphaAnimation anim = new AlphaAnimation(0.5F, 1);
259. anim.setDuration(ANIM_ALPHA_DURATION); 260. anim.startNow();
261. view.startAnimation(anim);
262. }
263.
264. }
DateWidgetDayHeader.java:
Java代码
1. package com.iaiai;
2.
3. import java.util.Calendar;
4.
5. import android.content.Context;
6. import android.graphics.Canvas;
7. import android.graphics.Paint;
8. import android.graphics.RectF;
9. import android.view.View;
10. import android.widget.LinearLayout.LayoutParams; 11.
33. public class DateWidgetDayHeader extends View { 34. // fields
35. private final static int iDayHeaderFontSize = 12; 36.
37. // fields
38. private Paint pt = new Paint();
39. private RectF rect = new RectF(); 40. private int iWeekDay = -1;
41. private boolean bHoliday = false; 42.
43. // methods
44. public DateWidgetDayHeader(Context context, int iWidth, int iHeight) {
45. super(context);
46. setLayoutParams(new LayoutParams(iWidth, iHeight));
47. }
14
48.
49. public void setData(int iWeekDay) {
50. this.iWeekDay = iWeekDay;
51. this.bHoliday = false;
52. if ((iWeekDay == Calendar.SATURDAY) || (iWeekDay == Calendar.SUNDAY))
53. this.bHoliday = true;
54. }
55.
56. private void drawDayHeader(Canvas canvas) { 57. if (iWeekDay != -1) {
58. // background
59. pt.setColor(DayStyle.getColorFrameHeader(bHoliday));
60. canvas.drawRect(rect, pt);
61.
62. // text
63. pt.setTypeface(null);
64. pt.setTextSize(iDayHeaderFontSize); 65. pt.setAntiAlias(true);
66. pt.setFakeBoldText(true);
67. pt.setColor(DayStyle.getColorTextHeader(bHoliday)); 68.
69. final int iTextPosY = getTextHeight(); 70. final String sDayName = DayStyle.getWeekDayName(iWeekDay);
71.
72. // draw day name
73. final int iDayNamePosX = (int) rect.left 74. + ((int) rect.width() >> 1) 75. - ((int) pt.measureText(sDayName) >> 1); 76. canvas.drawText(sDayName, iDayNamePosX, rect.top + iTextPosY + 2,
77. pt);
78. }
79. }
80.
81. private int getTextHeight() {
82. return (int) (-pt.ascent() + pt.descent()); 83. }
84.
85. @Override
86. protected void onDraw(Canvas canvas) { 87. super.onDraw(canvas);
88.
89. // init rectangles
90. rect.set(0, 0, this.getWidth(), this.getHeight()); 91. rect.inset(1, 1);
15
92.
93. // drawing
94. drawDayHeader(canvas);
95. }
96.
97. }
DayStyle.java:
Java代码
26. public class DayStyle {
27. // methods
28.
29. private static String[] getWeekDayNames() { 30. String[] vec = new String[10]; 31. // vec[Calendar.SUNDAY] = "Sun"; 32. // vec[Calendar.MONDAY] = "Mon"; 33. // vec[Calendar.TUESDAY] = "Tue"; 34. // vec[Calendar.WEDNESDAY] = "Wed"; 35. // vec[Calendar.THURSDAY] = "Thu"; 36. // vec[Calendar.FRIDAY] = "Fri"; 37. // vec[Calendar.SATURDAY] = "Sat"; 38.
39. vec[Calendar.SUNDAY] = "日";
40. vec[Calendar.MONDAY] = "月";
41. vec[Calendar.TUESDAY] = "火";
42. vec[Calendar.WEDNESDAY] = "水";
43. vec[Calendar.THURSDAY] = "木";
44. vec[Calendar.FRIDAY] = "金";
45. vec[Calendar.SATURDAY] = "土";
46. return vec;
47. }
48.
49. public static String getWeekDayName(int iDay) { 50. return vecStrWeekDayNames[iDay]; 51. }
52.
53. // fields
54. private final static String[] vecStrWeekDayNames = getWeekDayNames();
55.
56. // fields
57. public final static int iColorFrameHeader = 0xff666666;
58. public final static int iColorFrameHeaderHoliday = 0xff707070;
59. public final static int iColorTextHeader = 0xffcccccc;
60. public final static int iColorTextHeaderHoliday = 0xffd0d0d0;
16
61.
62. public final static int iColorText = 0xffdddddd; 63. public final static int iColorBkg = 0xff888888; 64. public final static int iColorTextHoliday = 0xfff0f0f0; 65. public final static int iColorBkgHoliday = 0xffaaaaaa; 66.
67. public final static int iColorTextToday = 0xff002200; 68. public final static int iColorBkgToday = 0xff88bb88; 69.
70. public final static int iColorTextSelected = 0xff001122; 71. public final static int iColorBkgSelectedLight = 0xffbbddff; 72. public final static int iColorBkgSelectedDark = 0xff225599; 73.
74. public final static int iColorTextFocused = 0xff221100; 75. public final static int iColorBkgFocusLight = 0xffffddbb; 76. public final static int iColorBkgFocusDark = 0xffaa5500; 77.
78. // methods
79. public static int getColorFrameHeader(boolean bHoliday) { 80. if (bHoliday)
81. return iColorFrameHeaderHoliday;
82. return iColorFrameHeader;
83. }
84.
85. public static int getColorTextHeader(boolean bHoliday) { 86. if (bHoliday)
87. return iColorTextHeaderHoliday;
88. return iColorTextHeader;
89. }
90.
91. public static int getColorText(boolean bHoliday, boolean bToday) { 92. if (bToday)
93. return iColorTextToday;
94. if (bHoliday)
95. return iColorTextHoliday;
96. return iColorText;
97. }
98.
99. public static int getColorBkg(boolean bHoliday, boolean bToday) { 100. if (bToday)
101. return iColorBkgToday;
102. if (bHoliday)
103. return iColorBkgHoliday;
104. return iColorBkg;
17
105. }
106.
107. public static int getWeekDay(int index, int iFirstDayOfWeek) {
108. int iWeekDay = -1;
109.
110. if (iFirstDayOfWeek == Calendar.MONDAY) { 111. iWeekDay = index + Calendar.MONDAY; 112. if (iWeekDay > Calendar.SATURDAY) 113. iWeekDay = Calendar.SUNDAY; 114. }
115.
116. if (iFirstDayOfWeek == Calendar.SUNDAY) { 117. iWeekDay = index + Calendar.SUNDAY; 118. }
119.
120. return iWeekDay;
121. }
122.
123. }
SymbolButton.java:
Java代码
1. package com.iaiai;
2.
3. import android.content.Context;
4. import android.graphics.Canvas;
5. import android.graphics.Paint;
6. import android.graphics.RectF;
7. import android.widget.Button;
8.
30. public class SymbolButton extends Button { 31. // fields
32. private static final int iColor = 0xffaaaaaa; 33. private static final int iColorActive = 0xff442200; 34.
35. // fields
36. public enum symbol {
37. none, arrowLeft, arrowRight
38. };
39.
40. // fields
41. private Paint pt = new Paint();
42. private RectF rect = new RectF(); 43. private RectF rectDraw = new RectF(); 18
44. private symbol symbolType = symbol.none; 45.
46. // methods
47. public SymbolButton(Context context, symbol symbolType) {
48. super(context);
49. this.symbolType = symbolType; 50. }
51.
52. @Override
53. public void onDraw(Canvas canvas) { 54. super.onDraw(canvas);
55.
56. pt.setAntiAlias(true);
57. pt.setStrokeCap(Paint.Cap.ROUND); 58.
59. rectDraw.set(0, 0, getWidth(), getHeight()); 60. rectDraw.left += 6;
61. rectDraw.right -= 6;
62. rectDraw.top += 4;
63. rectDraw.bottom -= 8;
64.
65. if (symbolType != symbol.none) { 66. pt.setStrokeWidth(5);
67.
68. pt.setColor(iColor);
69. if (this.isPressed() || this.isFocused()) 70. pt.setColor(iColorActive); 71.
72. drawArrow(canvas);
73. }
74. }
75.
76. private void drawArrow(Canvas canvas) { 77. rect.set(rectDraw);
78. rect.inset(15, 5);
79. canvas.drawLine(rect.left, rect.centerY(), rect.right, rect.centerY(),
80. pt);
81. if (symbolType == symbol.arrowRight) { 82. canvas.drawLine(rect.right, rect.centerY(), rect.right - 6,
83. rect.top, pt);
84. canvas.drawLine(rect.right, rect.centerY(), rect.right - 6,
85. rect.bottom, pt); 86. }
87. if (symbolType == symbol.arrowLeft) { 19
88. canvas.drawLine(rect.left, rect.centerY(), rect.left + 6, rect.top, 89. pt);
90. canvas.drawLine(rect.left, rect.centerY(), rect.left + 6, 91. rect.bottom, pt);
92. }
93. }
94.
95. }
20