Android 日历方式显示的日期选择组件

运行结果:


此Widget组件只包含五个类文件:
  • DateWidget
  • DateWidgetDayCell
  • DateWidgetDayHeader
  • DayStyle
  • SymbolButton

*红色为启动的activity

DateWidget.java:
Java代码 复制代码 收藏代码
  1. packagecom.iaiai;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.ArrayList;
  4. importjava.util.Calendar;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.view.Gravity;
  8. importandroid.view.View;
  9. importandroid.widget.Button;
  10. importandroid.widget.LinearLayout;
  11. importandroid.widget.LinearLayout.LayoutParams;
  12. importandroid.widget.TextView;
  13. /**
  14. *
  15. *<p>
  16. *Title:DateWidget.java
  17. *</p>
  18. *<p>
  19. *E-Mail:176291935@qq.com
  20. *</p>
  21. *<p>
  22. *QQ:176291935
  23. *</p>
  24. *<p>
  25. *Http:iaiai.iteye.com
  26. *</p>
  27. *<p>
  28. *Createtime:2011-8-19
  29. *</p>
  30. *
  31. *@author丸子
  32. *@version0.0.1
  33. */
  34. publicclassDateWidgetextendsActivity{
  35. privateArrayList<DateWidgetDayCell>days=newArrayList<DateWidgetDayCell>();
  36. //privateSimpleDateFormatdateMonth=newSimpleDateFormat("MMMMyyyy");
  37. privateCalendarcalStartDate=Calendar.getInstance();
  38. privateCalendarcalToday=Calendar.getInstance();
  39. privateCalendarcalCalendar=Calendar.getInstance();
  40. privateCalendarcalSelected=Calendar.getInstance();
  41. LinearLayoutlayContent=null;
  42. ButtonbtnPrev=null;
  43. ButtonbtnToday=null;
  44. ButtonbtnNext=null;
  45. privateintiFirstDayOfWeek=Calendar.MONDAY;
  46. privateintiMonthViewCurrentMonth=0;
  47. privateintiMonthViewCurrentYear=0;
  48. publicstaticfinalintSELECT_DATE_REQUEST=111;
  49. privatestaticfinalintiDayCellSize=38;
  50. privatestaticfinalintiDayHeaderHeight=24;
  51. privatestaticfinalintiTotalWidth=(iDayCellSize*7);
  52. privateTextViewtv;
  53. privateintmYear;
  54. privateintmMonth;
  55. privateintmDay;
  56. @Override
  57. publicvoidonCreate(Bundleicicle){
  58. super.onCreate(icicle);
  59. iFirstDayOfWeek=Calendar.MONDAY;
  60. mYear=calSelected.get(Calendar.YEAR);
  61. mMonth=calSelected.get(Calendar.MONTH);
  62. mDay=calSelected.get(Calendar.DAY_OF_MONTH);
  63. setContentView(generateContentView());
  64. calStartDate=getCalendarStartDate();
  65. DateWidgetDayCelldaySelected=updateCalendar();
  66. updateControlsState();
  67. if(daySelected!=null)
  68. daySelected.requestFocus();
  69. }
  70. @Override
  71. publicvoidonStart(){
  72. super.onStart();
  73. }
  74. privateLinearLayoutcreateLayout(intiOrientation){
  75. LinearLayoutlay=newLinearLayout(this);
  76. lay.setLayoutParams(newLayoutParams(
  77. android.view.ViewGroup.LayoutParams.FILL_PARENT,
  78. android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
  79. lay.setOrientation(iOrientation);
  80. returnlay;
  81. }
  82. privateButtoncreateButton(StringsText,intiWidth,intiHeight){
  83. Buttonbtn=newButton(this);
  84. btn.setText(sText);
  85. btn.setLayoutParams(newLayoutParams(iWidth,iHeight));
  86. returnbtn;
  87. }
  88. privatevoidgenerateTopButtons(LinearLayoutlayTopControls){
  89. finalintiHorPadding=24;
  90. finalintiSmallButtonWidth=60;
  91. btnToday=createButton("",iTotalWidth-iSmallButtonWidth
  92. -iSmallButtonWidth,
  93. android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
  94. btnToday.setPadding(iHorPadding,btnToday.getPaddingTop(),iHorPadding,
  95. btnToday.getPaddingBottom());
  96. btnToday.setBackgroundResource(android.R.drawable.btn_default_small);
  97. SymbolButtonbtnPrev=newSymbolButton(this,
  98. SymbolButton.symbol.arrowLeft);
  99. btnPrev.setLayoutParams(newLayoutParams(iSmallButtonWidth,
  100. android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
  101. btnPrev.setBackgroundResource(android.R.drawable.btn_default_small);
  102. SymbolButtonbtnNext=newSymbolButton(this,
  103. SymbolButton.symbol.arrowRight);
  104. btnNext.setLayoutParams(newLayoutParams(iSmallButtonWidth,
  105. android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
  106. btnNext.setBackgroundResource(android.R.drawable.btn_default_small);
  107. //setevents
  108. btnPrev.setOnClickListener(newButton.OnClickListener(){
  109. publicvoidonClick(Viewarg0){
  110. setPrevViewItem();
  111. }
  112. });
  113. btnToday.setOnClickListener(newButton.OnClickListener(){
  114. publicvoidonClick(Viewarg0){
  115. setTodayViewItem();
  116. Strings=calToday.get(Calendar.YEAR)+"/"
  117. +(calToday.get(Calendar.MONTH)+1);
  118. btnToday.setText(s);
  119. }
  120. });
  121. btnNext.setOnClickListener(newButton.OnClickListener(){
  122. publicvoidonClick(Viewarg0){
  123. setNextViewItem();
  124. }
  125. });
  126. layTopControls.setGravity(Gravity.CENTER_HORIZONTAL);
  127. layTopControls.addView(btnPrev);
  128. layTopControls.addView(btnToday);
  129. layTopControls.addView(btnNext);
  130. }
  131. privateViewgenerateContentView(){
  132. LinearLayoutlayMain=createLayout(LinearLayout.VERTICAL);
  133. layMain.setPadding(8,8,8,8);
  134. LinearLayoutlayTopControls=createLayout(LinearLayout.HORIZONTAL);
  135. layContent=createLayout(LinearLayout.VERTICAL);
  136. layContent.setPadding(20,0,20,0);
  137. generateTopButtons(layTopControls);
  138. generateCalendar(layContent);
  139. layMain.addView(layTopControls);
  140. layMain.addView(layContent);
  141. tv=newTextView(this);
  142. layMain.addView(tv);
  143. returnlayMain;
  144. }
  145. privateViewgenerateCalendarRow(){
  146. LinearLayoutlayRow=createLayout(LinearLayout.HORIZONTAL);
  147. for(intiDay=0;iDay<7;iDay++){
  148. DateWidgetDayCelldayCell=newDateWidgetDayCell(this,
  149. iDayCellSize,iDayCellSize);
  150. dayCell.setItemClick(mOnDayCellClick);
  151. days.add(dayCell);
  152. layRow.addView(dayCell);
  153. }
  154. returnlayRow;
  155. }
  156. privateViewgenerateCalendarHeader(){
  157. LinearLayoutlayRow=createLayout(LinearLayout.HORIZONTAL);
  158. for(intiDay=0;iDay<7;iDay++){
  159. DateWidgetDayHeaderday=newDateWidgetDayHeader(this,
  160. iDayCellSize,iDayHeaderHeight);
  161. finalintiWeekDay=DayStyle.getWeekDay(iDay,iFirstDayOfWeek);
  162. day.setData(iWeekDay);
  163. layRow.addView(day);
  164. }
  165. returnlayRow;
  166. }
  167. privatevoidgenerateCalendar(LinearLayoutlayContent){
  168. layContent.addView(generateCalendarHeader());
  169. days.clear();
  170. for(intiRow=0;iRow<6;iRow++){
  171. layContent.addView(generateCalendarRow());
  172. }
  173. }
  174. privateCalendargetCalendarStartDate(){
  175. calToday.setTimeInMillis(System.currentTimeMillis());
  176. calToday.setFirstDayOfWeek(iFirstDayOfWeek);
  177. if(calSelected.getTimeInMillis()==0){
  178. calStartDate.setTimeInMillis(System.currentTimeMillis());
  179. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
  180. }else{
  181. calStartDate.setTimeInMillis(calSelected.getTimeInMillis());
  182. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
  183. }
  184. UpdateStartDateForMonth();
  185. returncalStartDate;
  186. }
  187. privateDateWidgetDayCellupdateCalendar(){
  188. DateWidgetDayCelldaySelected=null;
  189. booleanbSelected=false;
  190. finalbooleanbIsSelection=(calSelected.getTimeInMillis()!=0);
  191. finalintiSelectedYear=calSelected.get(Calendar.YEAR);
  192. finalintiSelectedMonth=calSelected.get(Calendar.MONTH);
  193. finalintiSelectedDay=calSelected.get(Calendar.DAY_OF_MONTH);
  194. calCalendar.setTimeInMillis(calStartDate.getTimeInMillis());
  195. for(inti=0;i<days.size();i++){
  196. finalintiYear=calCalendar.get(Calendar.YEAR);
  197. finalintiMonth=calCalendar.get(Calendar.MONTH);
  198. finalintiDay=calCalendar.get(Calendar.DAY_OF_MONTH);
  199. finalintiDayOfWeek=calCalendar.get(Calendar.DAY_OF_WEEK);
  200. DateWidgetDayCelldayCell=days.get(i);
  201. //checktoday
  202. booleanbToday=false;
  203. if(calToday.get(Calendar.YEAR)==iYear)
  204. if(calToday.get(Calendar.MONTH)==iMonth)
  205. if(calToday.get(Calendar.DAY_OF_MONTH)==iDay)
  206. bToday=true;
  207. //checkholiday
  208. booleanbHoliday=false;
  209. if((iDayOfWeek==Calendar.SATURDAY)
  210. ||(iDayOfWeek==Calendar.SUNDAY))
  211. bHoliday=true;
  212. if((iMonth==Calendar.JANUARY)&&(iDay==1))
  213. bHoliday=true;
  214. dayCell.setData(iYear,iMonth,iDay,bToday,bHoliday,
  215. iMonthViewCurrentMonth);
  216. bSelected=false;
  217. if(bIsSelection)
  218. if((iSelectedDay==iDay)&&(iSelectedMonth==iMonth)
  219. &&(iSelectedYear==iYear)){
  220. bSelected=true;
  221. }
  222. dayCell.setSelected(bSelected);
  223. if(bSelected)
  224. daySelected=dayCell;
  225. calCalendar.add(Calendar.DAY_OF_MONTH,1);
  226. }
  227. layContent.invalidate();
  228. returndaySelected;
  229. }
  230. privatevoidUpdateStartDateForMonth(){
  231. iMonthViewCurrentMonth=calStartDate.get(Calendar.MONTH);
  232. iMonthViewCurrentYear=calStartDate.get(Calendar.YEAR);
  233. calStartDate.set(Calendar.DAY_OF_MONTH,1);
  234. UpdateCurrentMonthDisplay();
  235. //updatedaysforweek
  236. intiDay=0;
  237. intiStartDay=iFirstDayOfWeek;
  238. if(iStartDay==Calendar.MONDAY){
  239. iDay=calStartDate.get(Calendar.DAY_OF_WEEK)-Calendar.MONDAY;
  240. if(iDay<0)
  241. iDay=6;
  242. }
  243. if(iStartDay==Calendar.SUNDAY){
  244. iDay=calStartDate.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY;
  245. if(iDay<0)
  246. iDay=6;
  247. }
  248. calStartDate.add(Calendar.DAY_OF_WEEK,-iDay);
  249. }
  250. privatevoidUpdateCurrentMonthDisplay(){
  251. Strings=calCalendar.get(Calendar.YEAR)+"/"
  252. +(calCalendar.get(Calendar.MONTH)+1);//dateMonth.format(calCalendar.getTime());
  253. btnToday.setText(s);
  254. mYear=calCalendar.get(Calendar.YEAR);
  255. }
  256. privatevoidsetPrevViewItem(){
  257. iMonthViewCurrentMonth--;
  258. if(iMonthViewCurrentMonth==-1){
  259. iMonthViewCurrentMonth=11;
  260. iMonthViewCurrentYear--;
  261. }
  262. calStartDate.set(Calendar.DAY_OF_MONTH,1);
  263. calStartDate.set(Calendar.MONTH,iMonthViewCurrentMonth);
  264. calStartDate.set(Calendar.YEAR,iMonthViewCurrentYear);
  265. UpdateStartDateForMonth();
  266. updateCalendar();
  267. }
  268. privatevoidsetTodayViewItem(){
  269. calToday.setTimeInMillis(System.currentTimeMillis());
  270. calToday.setFirstDayOfWeek(iFirstDayOfWeek);
  271. calStartDate.setTimeInMillis(calToday.getTimeInMillis());
  272. calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
  273. UpdateStartDateForMonth();
  274. updateCalendar();
  275. }
  276. privatevoidsetNextViewItem(){
  277. iMonthViewCurrentMonth++;
  278. if(iMonthViewCurrentMonth==12){
  279. iMonthViewCurrentMonth=0;
  280. iMonthViewCurrentYear++;
  281. }
  282. calStartDate.set(Calendar.DAY_OF_MONTH,1);
  283. calStartDate.set(Calendar.MONTH,iMonthViewCurrentMonth);
  284. calStartDate.set(Calendar.YEAR,iMonthViewCurrentYear);
  285. UpdateStartDateForMonth();
  286. updateCalendar();
  287. }
  288. privateDateWidgetDayCell.OnItemClickmOnDayCellClick=newDateWidgetDayCell.OnItemClick(){
  289. publicvoidOnClick(DateWidgetDayCellitem){
  290. calSelected.setTimeInMillis(item.getDate().getTimeInMillis());
  291. item.setSelected(true);
  292. updateCalendar();
  293. updateControlsState();
  294. }
  295. };
  296. privatevoidupdateControlsState(){
  297. SimpleDateFormatdateFull=newSimpleDateFormat("dMMMMyyyy");
  298. mYear=calSelected.get(Calendar.YEAR);
  299. mMonth=calSelected.get(Calendar.MONTH);
  300. mDay=calSelected.get(Calendar.DAY_OF_MONTH);
  301. tv.setText(newStringBuilder().append(mYear).append("/")
  302. .append(format(mMonth+1)).append("/").append(format(mDay))
  303. .append("-----").append(dateFull.format(calSelected.getTime())));
  304. }
  305. privateStringformat(intx){
  306. Strings=""+x;
  307. if(s.length()==1)
  308. s="0"+s;
  309. returns;
  310. }
  311. }
package com.iaiai;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

/**
 * 
 * <p>
 * Title: DateWidget.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-19
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class DateWidget extends Activity {
	private ArrayList<DateWidgetDayCell> days = new ArrayList<DateWidgetDayCell>();
	// private SimpleDateFormat dateMonth = new SimpleDateFormat("MMMM yyyy");
	private Calendar calStartDate = Calendar.getInstance();
	private Calendar calToday = Calendar.getInstance();
	private Calendar calCalendar = Calendar.getInstance();
	private Calendar calSelected = Calendar.getInstance();
	LinearLayout layContent = null;
	Button btnPrev = null;
	Button btnToday = null;
	Button btnNext = null;
	private int iFirstDayOfWeek = Calendar.MONDAY;
	private int iMonthViewCurrentMonth = 0;
	private int iMonthViewCurrentYear = 0;
	public static final int SELECT_DATE_REQUEST = 111;
	private static final int iDayCellSize = 38;
	private static final int iDayHeaderHeight = 24;
	private static final int iTotalWidth = (iDayCellSize * 7);
	private TextView tv;
	private int mYear;
	private int mMonth;
	private int mDay;

	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		iFirstDayOfWeek = Calendar.MONDAY;
		mYear = calSelected.get(Calendar.YEAR);
		mMonth = calSelected.get(Calendar.MONTH);
		mDay = calSelected.get(Calendar.DAY_OF_MONTH);
		setContentView(generateContentView());
		calStartDate = getCalendarStartDate();
		DateWidgetDayCell daySelected = updateCalendar();
		updateControlsState();
		if (daySelected != null)
			daySelected.requestFocus();
	}

	@Override
	public void onStart() {
		super.onStart();

	}

	private LinearLayout createLayout(int iOrientation) {
		LinearLayout lay = new LinearLayout(this);
		lay.setLayoutParams(new LayoutParams(
				android.view.ViewGroup.LayoutParams.FILL_PARENT,
				android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
		lay.setOrientation(iOrientation);
		return lay;
	}

	private Button createButton(String sText, int iWidth, int iHeight) {
		Button btn = new Button(this);
		btn.setText(sText);
		btn.setLayoutParams(new LayoutParams(iWidth, iHeight));
		return btn;
	}

	private void generateTopButtons(LinearLayout layTopControls) {
		final int iHorPadding = 24;
		final int iSmallButtonWidth = 60;
		btnToday = createButton("", iTotalWidth - iSmallButtonWidth
				- iSmallButtonWidth,
				android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
		btnToday.setPadding(iHorPadding, btnToday.getPaddingTop(), iHorPadding,
				btnToday.getPaddingBottom());
		btnToday.setBackgroundResource(android.R.drawable.btn_default_small);

		SymbolButton btnPrev = new SymbolButton(this,
				SymbolButton.symbol.arrowLeft);
		btnPrev.setLayoutParams(new LayoutParams(iSmallButtonWidth,
				android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
		btnPrev.setBackgroundResource(android.R.drawable.btn_default_small);

		SymbolButton btnNext = new SymbolButton(this,
				SymbolButton.symbol.arrowRight);
		btnNext.setLayoutParams(new LayoutParams(iSmallButtonWidth,
				android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
		btnNext.setBackgroundResource(android.R.drawable.btn_default_small);

		// set events
		btnPrev.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View arg0) {
				setPrevViewItem();
			}
		});
		btnToday.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View arg0) {

				setTodayViewItem();
				String s = calToday.get(Calendar.YEAR) + "/"
						+ (calToday.get(Calendar.MONTH) + 1);
				btnToday.setText(s);
			}
		});
		btnNext.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View arg0) {
				setNextViewItem();
			}
		});

		layTopControls.setGravity(Gravity.CENTER_HORIZONTAL);
		layTopControls.addView(btnPrev);
		layTopControls.addView(btnToday);
		layTopControls.addView(btnNext);
	}

	private View generateContentView() {
		LinearLayout layMain = createLayout(LinearLayout.VERTICAL);
		layMain.setPadding(8, 8, 8, 8);
		LinearLayout layTopControls = createLayout(LinearLayout.HORIZONTAL);

		layContent = createLayout(LinearLayout.VERTICAL);
		layContent.setPadding(20, 0, 20, 0);
		generateTopButtons(layTopControls);
		generateCalendar(layContent);
		layMain.addView(layTopControls);
		layMain.addView(layContent);

		tv = new TextView(this);
		layMain.addView(tv);
		return layMain;
	}

	private View generateCalendarRow() {
		LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL);
		for (int iDay = 0; iDay < 7; iDay++) {
			DateWidgetDayCell dayCell = new DateWidgetDayCell(this,
					iDayCellSize, iDayCellSize);
			dayCell.setItemClick(mOnDayCellClick);
			days.add(dayCell);
			layRow.addView(dayCell);
		}
		return layRow;
	}

	private View generateCalendarHeader() {
		LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL);
		for (int iDay = 0; iDay < 7; iDay++) {
			DateWidgetDayHeader day = new DateWidgetDayHeader(this,
					iDayCellSize, iDayHeaderHeight);
			final int iWeekDay = DayStyle.getWeekDay(iDay, iFirstDayOfWeek);
			day.setData(iWeekDay);
			layRow.addView(day);
		}
		return layRow;
	}

	private void generateCalendar(LinearLayout layContent) {
		layContent.addView(generateCalendarHeader());
		days.clear();
		for (int iRow = 0; iRow < 6; iRow++) {
			layContent.addView(generateCalendarRow());
		}
	}

	private Calendar getCalendarStartDate() {
		calToday.setTimeInMillis(System.currentTimeMillis());
		calToday.setFirstDayOfWeek(iFirstDayOfWeek);

		if (calSelected.getTimeInMillis() == 0) {
			calStartDate.setTimeInMillis(System.currentTimeMillis());
			calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
		} else {
			calStartDate.setTimeInMillis(calSelected.getTimeInMillis());
			calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
		}

		UpdateStartDateForMonth();

		return calStartDate;
	}

	private DateWidgetDayCell updateCalendar() {
		DateWidgetDayCell daySelected = null;
		boolean bSelected = false;
		final boolean bIsSelection = (calSelected.getTimeInMillis() != 0);
		final int iSelectedYear = calSelected.get(Calendar.YEAR);
		final int iSelectedMonth = calSelected.get(Calendar.MONTH);
		final int iSelectedDay = calSelected.get(Calendar.DAY_OF_MONTH);
		calCalendar.setTimeInMillis(calStartDate.getTimeInMillis());
		for (int i = 0; i < days.size(); i++) {
			final int iYear = calCalendar.get(Calendar.YEAR);
			final int iMonth = calCalendar.get(Calendar.MONTH);
			final int iDay = calCalendar.get(Calendar.DAY_OF_MONTH);
			final int iDayOfWeek = calCalendar.get(Calendar.DAY_OF_WEEK);
			DateWidgetDayCell dayCell = days.get(i);
			// check today
			boolean bToday = false;
			if (calToday.get(Calendar.YEAR) == iYear)
				if (calToday.get(Calendar.MONTH) == iMonth)
					if (calToday.get(Calendar.DAY_OF_MONTH) == iDay)
						bToday = true;
			// check holiday
			boolean bHoliday = false;
			if ((iDayOfWeek == Calendar.SATURDAY)
					|| (iDayOfWeek == Calendar.SUNDAY))
				bHoliday = true;
			if ((iMonth == Calendar.JANUARY) && (iDay == 1))
				bHoliday = true;

			dayCell.setData(iYear, iMonth, iDay, bToday, bHoliday,
					iMonthViewCurrentMonth);
			bSelected = false;
			if (bIsSelection)
				if ((iSelectedDay == iDay) && (iSelectedMonth == iMonth)
						&& (iSelectedYear == iYear)) {
					bSelected = true;
				}
			dayCell.setSelected(bSelected);
			if (bSelected)
				daySelected = dayCell;
			calCalendar.add(Calendar.DAY_OF_MONTH, 1);
		}
		layContent.invalidate();
		return daySelected;
	}

	private void UpdateStartDateForMonth() {
		iMonthViewCurrentMonth = calStartDate.get(Calendar.MONTH);
		iMonthViewCurrentYear = calStartDate.get(Calendar.YEAR);
		calStartDate.set(Calendar.DAY_OF_MONTH, 1);
		UpdateCurrentMonthDisplay();
		// update days for week
		int iDay = 0;
		int iStartDay = iFirstDayOfWeek;
		if (iStartDay == Calendar.MONDAY) {
			iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY;
			if (iDay < 0)
				iDay = 6;
		}
		if (iStartDay == Calendar.SUNDAY) {
			iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
			if (iDay < 0)
				iDay = 6;
		}
		calStartDate.add(Calendar.DAY_OF_WEEK, -iDay);
	}

	private void UpdateCurrentMonthDisplay() {
		String s = calCalendar.get(Calendar.YEAR) + "/"
				+ (calCalendar.get(Calendar.MONTH) + 1);// dateMonth.format(calCalendar.getTime());
		btnToday.setText(s);
		mYear = calCalendar.get(Calendar.YEAR);
	}

	private void setPrevViewItem() {
		iMonthViewCurrentMonth--;
		if (iMonthViewCurrentMonth == -1) {
			iMonthViewCurrentMonth = 11;
			iMonthViewCurrentYear--;
		}
		calStartDate.set(Calendar.DAY_OF_MONTH, 1);
		calStartDate.set(Calendar.MONTH, iMonthViewCurrentMonth);
		calStartDate.set(Calendar.YEAR, iMonthViewCurrentYear);
		UpdateStartDateForMonth();
		updateCalendar();

	}

	private void setTodayViewItem() {
		calToday.setTimeInMillis(System.currentTimeMillis());
		calToday.setFirstDayOfWeek(iFirstDayOfWeek);
		calStartDate.setTimeInMillis(calToday.getTimeInMillis());
		calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
		UpdateStartDateForMonth();
		updateCalendar();
	}

	private void setNextViewItem() {
		iMonthViewCurrentMonth++;
		if (iMonthViewCurrentMonth == 12) {
			iMonthViewCurrentMonth = 0;
			iMonthViewCurrentYear++;
		}
		calStartDate.set(Calendar.DAY_OF_MONTH, 1);
		calStartDate.set(Calendar.MONTH, iMonthViewCurrentMonth);
		calStartDate.set(Calendar.YEAR, iMonthViewCurrentYear);
		UpdateStartDateForMonth();
		updateCalendar();

	}

	private DateWidgetDayCell.OnItemClick mOnDayCellClick = new DateWidgetDayCell.OnItemClick() {
		public void OnClick(DateWidgetDayCell item) {
			calSelected.setTimeInMillis(item.getDate().getTimeInMillis());
			item.setSelected(true);
			updateCalendar();
			updateControlsState();
		}
	};

	private void updateControlsState() {
		SimpleDateFormat dateFull = new SimpleDateFormat("d MMMM yyyy");
		mYear = calSelected.get(Calendar.YEAR);
		mMonth = calSelected.get(Calendar.MONTH);
		mDay = calSelected.get(Calendar.DAY_OF_MONTH);
		tv.setText(new StringBuilder().append(mYear).append("/")
				.append(format(mMonth + 1)).append("/").append(format(mDay))
				.append("-----").append(dateFull.format(calSelected.getTime())));
	}

	private String format(int x) {
		String s = "" + x;
		if (s.length() == 1)
			s = "0" + s;
		return s;
	}

}


DateWidgetDayCell.java:
Java代码 复制代码 收藏代码
  1. packagecom.iaiai;
  2. importjava.util.Calendar;
  3. importandroid.content.Context;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.LinearGradient;
  6. importandroid.graphics.Paint;
  7. importandroid.graphics.Rect;
  8. importandroid.graphics.RectF;
  9. importandroid.graphics.Shader;
  10. importandroid.view.KeyEvent;
  11. importandroid.view.MotionEvent;
  12. importandroid.view.View;
  13. importandroid.view.animation.AlphaAnimation;
  14. importandroid.widget.LinearLayout.LayoutParams;
  15. /**
  16. *
  17. *<p>
  18. *Title:DateWidgetDayCell.java
  19. *</p>
  20. *<p>
  21. *E-Mail:176291935@qq.com
  22. *</p>
  23. *<p>
  24. *QQ:176291935
  25. *</p>
  26. *<p>
  27. *Http:iaiai.iteye.com
  28. *</p>
  29. *<p>
  30. *Createtime:2011-8-19
  31. *</p>
  32. *
  33. *@author丸子
  34. *@version0.0.1
  35. */
  36. publicclassDateWidgetDayCellextendsView{
  37. //types
  38. publicinterfaceOnItemClick{
  39. publicvoidOnClick(DateWidgetDayCellitem);
  40. }
  41. publicstaticintANIM_ALPHA_DURATION=100;
  42. //fields
  43. privatefinalstaticfloatfTextSize=22;
  44. privatefinalstaticintiMargin=1;
  45. privatefinalstaticintiAlphaInactiveMonth=0x88;
  46. //fields
  47. privateintiDateYear=0;
  48. privateintiDateMonth=0;
  49. privateintiDateDay=0;
  50. //fields
  51. privateOnItemClickitemClick=null;
  52. privatePaintpt=newPaint();
  53. privateRectFrect=newRectF();
  54. privateStringsDate="";
  55. //fields
  56. privatebooleanbSelected=false;
  57. privatebooleanbIsActiveMonth=false;
  58. privatebooleanbToday=false;
  59. privatebooleanbHoliday=false;
  60. privatebooleanbTouchedDown=false;
  61. //methods
  62. publicDateWidgetDayCell(Contextcontext,intiWidth,intiHeight){
  63. super(context);
  64. setFocusable(true);
  65. setLayoutParams(newLayoutParams(iWidth,iHeight));
  66. }
  67. publicbooleangetSelected(){
  68. returnthis.bSelected;
  69. }
  70. @Override
  71. publicvoidsetSelected(booleanbEnable){
  72. if(this.bSelected!=bEnable){
  73. this.bSelected=bEnable;
  74. this.invalidate();
  75. }
  76. }
  77. publicvoidsetData(intiYear,intiMonth,intiDay,booleanbToday,
  78. booleanbHoliday,intiActiveMonth){
  79. iDateYear=iYear;
  80. iDateMonth=iMonth;
  81. iDateDay=iDay;
  82. this.sDate=Integer.toString(iDateDay);
  83. this.bIsActiveMonth=(iDateMonth==iActiveMonth);
  84. this.bToday=bToday;
  85. this.bHoliday=bHoliday;
  86. }
  87. publicvoidsetItemClick(OnItemClickitemClick){
  88. this.itemClick=itemClick;
  89. }
  90. privateintgetTextHeight(){
  91. return(int)(-pt.ascent()+pt.descent());
  92. }
  93. @Override
  94. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  95. booleanbResult=super.onKeyDown(keyCode,event);
  96. if((keyCode==KeyEvent.KEYCODE_DPAD_CENTER)
  97. ||(keyCode==KeyEvent.KEYCODE_ENTER)){
  98. doItemClick();
  99. }
  100. returnbResult;
  101. }
  102. @Override
  103. publicbooleanonKeyUp(intkeyCode,KeyEventevent){
  104. booleanbResult=super.onKeyUp(keyCode,event);
  105. returnbResult;
  106. }
  107. publicvoiddoItemClick(){
  108. if(itemClick!=null)
  109. itemClick.OnClick(this);
  110. }
  111. @Override
  112. protectedvoidonFocusChanged(booleangainFocus,intdirection,
  113. RectpreviouslyFocusedRect){
  114. super.onFocusChanged(gainFocus,direction,previouslyFocusedRect);
  115. invalidate();
  116. }
  117. publicCalendargetDate(){
  118. CalendarcalDate=Calendar.getInstance();
  119. calDate.clear();
  120. calDate.set(Calendar.YEAR,iDateYear);
  121. calDate.set(Calendar.MONTH,iDateMonth);
  122. calDate.set(Calendar.DAY_OF_MONTH,iDateDay);
  123. returncalDate;
  124. }
  125. @Override
  126. protectedvoidonDraw(Canvascanvas){
  127. super.onDraw(canvas);
  128. //initrectangles
  129. rect.set(0,0,this.getWidth(),this.getHeight());
  130. rect.inset(1,1);
  131. //drawing
  132. finalbooleanbFocused=IsViewFocused();
  133. drawDayView(canvas,bFocused);
  134. drawDayNumber(canvas,bFocused);
  135. }
  136. privatevoiddrawDayView(Canvascanvas,booleanbFocused){
  137. if(bSelected||bFocused){
  138. LinearGradientlGradBkg=null;
  139. if(bFocused){
  140. lGradBkg=newLinearGradient(rect.left,0,rect.right,0,
  141. DayStyle.iColorBkgFocusDark,
  142. DayStyle.iColorBkgFocusLight,Shader.TileMode.CLAMP);
  143. }
  144. if(bSelected){
  145. lGradBkg=newLinearGradient(rect.left,0,rect.right,0,
  146. DayStyle.iColorBkgSelectedDark,
  147. DayStyle.iColorBkgSelectedLight,Shader.TileMode.CLAMP);
  148. }
  149. if(lGradBkg!=null){
  150. pt.setShader(lGradBkg);
  151. canvas.drawRect(rect,pt);
  152. }
  153. pt.setShader(null);
  154. }else{
  155. pt.setColor(DayStyle.getColorBkg(bHoliday,bToday));
  156. if(!bIsActiveMonth)
  157. pt.setAlpha(iAlphaInactiveMonth);
  158. canvas.drawRect(rect,pt);
  159. }
  160. }
  161. publicvoiddrawDayNumber(Canvascanvas,booleanbFocused){
  162. //drawdaynumber
  163. pt.setTypeface(null);
  164. pt.setAntiAlias(true);
  165. pt.setShader(null);
  166. pt.setFakeBoldText(true);
  167. pt.setTextSize(fTextSize);
  168. pt.setUnderlineText(false);
  169. if(bToday)
  170. pt.setUnderlineText(true);
  171. intiTextPosX=(int)rect.right-(int)pt.measureText(sDate);
  172. intiTextPosY=(int)rect.bottom+(int)(-pt.ascent())
  173. -getTextHeight();
  174. iTextPosX-=((int)rect.width()>>1)
  175. -((int)pt.measureText(sDate)>>1);
  176. iTextPosY-=((int)rect.height()>>1)-(getTextHeight()>>1);
  177. //drawtext
  178. if(bSelected||bFocused){
  179. if(bSelected)
  180. pt.setColor(DayStyle.iColorTextSelected);
  181. if(bFocused)
  182. pt.setColor(DayStyle.iColorTextFocused);
  183. }else{
  184. pt.setColor(DayStyle.getColorText(bHoliday,bToday));
  185. }
  186. if(!bIsActiveMonth)
  187. pt.setAlpha(iAlphaInactiveMonth);
  188. canvas.drawText(sDate,iTextPosX,iTextPosY+iMargin,pt);
  189. pt.setUnderlineText(false);
  190. }
  191. publicbooleanIsViewFocused(){
  192. return(this.isFocused()||bTouchedDown);
  193. }
  194. @Override
  195. publicbooleanonTouchEvent(MotionEventevent){
  196. booleanbHandled=false;
  197. if(event.getAction()==MotionEvent.ACTION_DOWN){
  198. bHandled=true;
  199. bTouchedDown=true;
  200. invalidate();
  201. startAlphaAnimIn(DateWidgetDayCell.this);
  202. }
  203. if(event.getAction()==MotionEvent.ACTION_CANCEL){
  204. bHandled=true;
  205. bTouchedDown=false;
  206. invalidate();
  207. }
  208. if(event.getAction()==MotionEvent.ACTION_UP){
  209. bHandled=true;
  210. bTouchedDown=false;
  211. invalidate();
  212. doItemClick();
  213. }
  214. returnbHandled;
  215. }
  216. publicstaticvoidstartAlphaAnimIn(Viewview){
  217. AlphaAnimationanim=newAlphaAnimation(0.5F,1);
  218. anim.setDuration(ANIM_ALPHA_DURATION);
  219. anim.startNow();
  220. view.startAnimation(anim);
  221. }
  222. }
package com.iaiai;

import java.util.Calendar;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.LinearLayout.LayoutParams;

/**
 * 
 * <p>
 * Title: DateWidgetDayCell.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-19
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class DateWidgetDayCell extends View {
	// types
	public interface OnItemClick {
		public void OnClick(DateWidgetDayCell item);
	}

	public static int ANIM_ALPHA_DURATION = 100;
	// fields
	private final static float fTextSize = 22;
	private final static int iMargin = 1;
	private final static int iAlphaInactiveMonth = 0x88;

	// fields
	private int iDateYear = 0;
	private int iDateMonth = 0;
	private int iDateDay = 0;

	// fields
	private OnItemClick itemClick = null;
	private Paint pt = new Paint();
	private RectF rect = new RectF();
	private String sDate = "";

	// fields
	private boolean bSelected = false;
	private boolean bIsActiveMonth = false;
	private boolean bToday = false;
	private boolean bHoliday = false;
	private boolean bTouchedDown = false;

	// methods
	public DateWidgetDayCell(Context context, int iWidth, int iHeight) {
		super(context);
		setFocusable(true);
		setLayoutParams(new LayoutParams(iWidth, iHeight));
	}

	public boolean getSelected() {
		return this.bSelected;
	}

	@Override
	public void setSelected(boolean bEnable) {
		if (this.bSelected != bEnable) {
			this.bSelected = bEnable;
			this.invalidate();
		}
	}

	public void setData(int iYear, int iMonth, int iDay, boolean bToday,
			boolean bHoliday, int iActiveMonth) {
		iDateYear = iYear;
		iDateMonth = iMonth;
		iDateDay = iDay;

		this.sDate = Integer.toString(iDateDay);
		this.bIsActiveMonth = (iDateMonth == iActiveMonth);
		this.bToday = bToday;
		this.bHoliday = bHoliday;
	}

	public void setItemClick(OnItemClick itemClick) {
		this.itemClick = itemClick;
	}

	private int getTextHeight() {
		return (int) (-pt.ascent() + pt.descent());
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		boolean bResult = super.onKeyDown(keyCode, event);
		if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
				|| (keyCode == KeyEvent.KEYCODE_ENTER)) {
			doItemClick();
		}
		return bResult;
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		boolean bResult = super.onKeyUp(keyCode, event);
		return bResult;
	}

	public void doItemClick() {
		if (itemClick != null)
			itemClick.OnClick(this);
	}

	@Override
	protected void onFocusChanged(boolean gainFocus, int direction,
			Rect previouslyFocusedRect) {
		super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
		invalidate();
	}

	public Calendar getDate() {
		Calendar calDate = Calendar.getInstance();
		calDate.clear();
		calDate.set(Calendar.YEAR, iDateYear);
		calDate.set(Calendar.MONTH, iDateMonth);
		calDate.set(Calendar.DAY_OF_MONTH, iDateDay);
		return calDate;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		// init rectangles
		rect.set(0, 0, this.getWidth(), this.getHeight());
		rect.inset(1, 1);

		// drawing
		final boolean bFocused = IsViewFocused();

		drawDayView(canvas, bFocused);
		drawDayNumber(canvas, bFocused);
	}

	private void drawDayView(Canvas canvas, boolean bFocused) {
		if (bSelected || bFocused) {
			LinearGradient lGradBkg = null;

			if (bFocused) {
				lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0,
						DayStyle.iColorBkgFocusDark,
						DayStyle.iColorBkgFocusLight, Shader.TileMode.CLAMP);
			}

			if (bSelected) {
				lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0,
						DayStyle.iColorBkgSelectedDark,
						DayStyle.iColorBkgSelectedLight, Shader.TileMode.CLAMP);
			}

			if (lGradBkg != null) {
				pt.setShader(lGradBkg);
				canvas.drawRect(rect, pt);
			}

			pt.setShader(null);

		} else {

			pt.setColor(DayStyle.getColorBkg(bHoliday, bToday));
			if (!bIsActiveMonth)
				pt.setAlpha(iAlphaInactiveMonth);
			canvas.drawRect(rect, pt);
		}
	}

	public void drawDayNumber(Canvas canvas, boolean bFocused) {
		// draw day number
		pt.setTypeface(null);
		pt.setAntiAlias(true);
		pt.setShader(null);
		pt.setFakeBoldText(true);
		pt.setTextSize(fTextSize);

		pt.setUnderlineText(false);
		if (bToday)
			pt.setUnderlineText(true);

		int iTextPosX = (int) rect.right - (int) pt.measureText(sDate);
		int iTextPosY = (int) rect.bottom + (int) (-pt.ascent())
				- getTextHeight();

		iTextPosX -= ((int) rect.width() >> 1)
				- ((int) pt.measureText(sDate) >> 1);
		iTextPosY -= ((int) rect.height() >> 1) - (getTextHeight() >> 1);

		// draw text
		if (bSelected || bFocused) {
			if (bSelected)
				pt.setColor(DayStyle.iColorTextSelected);
			if (bFocused)
				pt.setColor(DayStyle.iColorTextFocused);
		} else {
			pt.setColor(DayStyle.getColorText(bHoliday, bToday));
		}

		if (!bIsActiveMonth)
			pt.setAlpha(iAlphaInactiveMonth);

		canvas.drawText(sDate, iTextPosX, iTextPosY + iMargin, pt);

		pt.setUnderlineText(false);
	}

	public boolean IsViewFocused() {
		return (this.isFocused() || bTouchedDown);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		boolean bHandled = false;
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			bHandled = true;
			bTouchedDown = true;
			invalidate();
			startAlphaAnimIn(DateWidgetDayCell.this);
		}
		if (event.getAction() == MotionEvent.ACTION_CANCEL) {
			bHandled = true;
			bTouchedDown = false;
			invalidate();
		}
		if (event.getAction() == MotionEvent.ACTION_UP) {
			bHandled = true;
			bTouchedDown = false;
			invalidate();
			doItemClick();
		}
		return bHandled;
	}

	public static void startAlphaAnimIn(View view) {
		AlphaAnimation anim = new AlphaAnimation(0.5F, 1);
		anim.setDuration(ANIM_ALPHA_DURATION);
		anim.startNow();
		view.startAnimation(anim);
	}

}


DateWidgetDayHeader.java:
Java代码 复制代码 收藏代码
  1. packagecom.iaiai;
  2. importjava.util.Calendar;
  3. importandroid.content.Context;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.RectF;
  7. importandroid.view.View;
  8. importandroid.widget.LinearLayout.LayoutParams;
  9. /**
  10. *
  11. *<p>
  12. *Title:DateWidgetDayHeader.java
  13. *</p>
  14. *<p>
  15. *E-Mail:176291935@qq.com
  16. *</p>
  17. *<p>
  18. *QQ:176291935
  19. *</p>
  20. *<p>
  21. *Http:iaiai.iteye.com
  22. *</p>
  23. *<p>
  24. *Createtime:2011-8-19
  25. *</p>
  26. *
  27. *@author丸子
  28. *@version0.0.1
  29. */
  30. publicclassDateWidgetDayHeaderextendsView{
  31. //fields
  32. privatefinalstaticintiDayHeaderFontSize=12;
  33. //fields
  34. privatePaintpt=newPaint();
  35. privateRectFrect=newRectF();
  36. privateintiWeekDay=-1;
  37. privatebooleanbHoliday=false;
  38. //methods
  39. publicDateWidgetDayHeader(Contextcontext,intiWidth,intiHeight){
  40. super(context);
  41. setLayoutParams(newLayoutParams(iWidth,iHeight));
  42. }
  43. publicvoidsetData(intiWeekDay){
  44. this.iWeekDay=iWeekDay;
  45. this.bHoliday=false;
  46. if((iWeekDay==Calendar.SATURDAY)||(iWeekDay==Calendar.SUNDAY))
  47. this.bHoliday=true;
  48. }
  49. privatevoiddrawDayHeader(Canvascanvas){
  50. if(iWeekDay!=-1){
  51. //background
  52. pt.setColor(DayStyle.getColorFrameHeader(bHoliday));
  53. canvas.drawRect(rect,pt);
  54. //text
  55. pt.setTypeface(null);
  56. pt.setTextSize(iDayHeaderFontSize);
  57. pt.setAntiAlias(true);
  58. pt.setFakeBoldText(true);
  59. pt.setColor(DayStyle.getColorTextHeader(bHoliday));
  60. finalintiTextPosY=getTextHeight();
  61. finalStringsDayName=DayStyle.getWeekDayName(iWeekDay);
  62. //drawdayname
  63. finalintiDayNamePosX=(int)rect.left
  64. +((int)rect.width()>>1)
  65. -((int)pt.measureText(sDayName)>>1);
  66. canvas.drawText(sDayName,iDayNamePosX,rect.top+iTextPosY+2,
  67. pt);
  68. }
  69. }
  70. privateintgetTextHeight(){
  71. return(int)(-pt.ascent()+pt.descent());
  72. }
  73. @Override
  74. protectedvoidonDraw(Canvascanvas){
  75. super.onDraw(canvas);
  76. //initrectangles
  77. rect.set(0,0,this.getWidth(),this.getHeight());
  78. rect.inset(1,1);
  79. //drawing
  80. drawDayHeader(canvas);
  81. }
  82. }
package com.iaiai;

import java.util.Calendar;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
import android.widget.LinearLayout.LayoutParams;

/**
 * 
 * <p>
 * Title: DateWidgetDayHeader.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-19
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class DateWidgetDayHeader extends View {
	// fields
	private final static int iDayHeaderFontSize = 12;

	// fields
	private Paint pt = new Paint();
	private RectF rect = new RectF();
	private int iWeekDay = -1;
	private boolean bHoliday = false;

	// methods
	public DateWidgetDayHeader(Context context, int iWidth, int iHeight) {
		super(context);
		setLayoutParams(new LayoutParams(iWidth, iHeight));
	}

	public void setData(int iWeekDay) {
		this.iWeekDay = iWeekDay;
		this.bHoliday = false;
		if ((iWeekDay == Calendar.SATURDAY) || (iWeekDay == Calendar.SUNDAY))
			this.bHoliday = true;
	}

	private void drawDayHeader(Canvas canvas) {
		if (iWeekDay != -1) {
			// background
			pt.setColor(DayStyle.getColorFrameHeader(bHoliday));
			canvas.drawRect(rect, pt);

			// text
			pt.setTypeface(null);
			pt.setTextSize(iDayHeaderFontSize);
			pt.setAntiAlias(true);
			pt.setFakeBoldText(true);
			pt.setColor(DayStyle.getColorTextHeader(bHoliday));

			final int iTextPosY = getTextHeight();
			final String sDayName = DayStyle.getWeekDayName(iWeekDay);

			// draw day name
			final int iDayNamePosX = (int) rect.left
					+ ((int) rect.width() >> 1)
					- ((int) pt.measureText(sDayName) >> 1);
			canvas.drawText(sDayName, iDayNamePosX, rect.top + iTextPosY + 2,
					pt);
		}
	}

	private int getTextHeight() {
		return (int) (-pt.ascent() + pt.descent());
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		// init rectangles
		rect.set(0, 0, this.getWidth(), this.getHeight());
		rect.inset(1, 1);

		// drawing
		drawDayHeader(canvas);
	}

}


DayStyle.java:
Java代码 复制代码 收藏代码
  1. packagecom.iaiai;
  2. importjava.util.Calendar;
  3. /**
  4. *
  5. *<p>
  6. *Title:DayStyle.java
  7. *</p>
  8. *<p>
  9. *E-Mail:176291935@qq.com
  10. *</p>
  11. *<p>
  12. *QQ:176291935
  13. *</p>
  14. *<p>
  15. *Http:iaiai.iteye.com
  16. *</p>
  17. *<p>
  18. *Createtime:2011-8-19
  19. *</p>
  20. *
  21. *@author丸子
  22. *@version0.0.1
  23. */
  24. publicclassDayStyle{
  25. //methods
  26. privatestaticString[]getWeekDayNames(){
  27. String[]vec=newString[10];
  28. //vec[Calendar.SUNDAY]="Sun";
  29. //vec[Calendar.MONDAY]="Mon";
  30. //vec[Calendar.TUESDAY]="Tue";
  31. //vec[Calendar.WEDNESDAY]="Wed";
  32. //vec[Calendar.THURSDAY]="Thu";
  33. //vec[Calendar.FRIDAY]="Fri";
  34. //vec[Calendar.SATURDAY]="Sat";
  35. vec[Calendar.SUNDAY]="日";
  36. vec[Calendar.MONDAY]="月";
  37. vec[Calendar.TUESDAY]="火";
  38. vec[Calendar.WEDNESDAY]="水";
  39. vec[Calendar.THURSDAY]="木";
  40. vec[Calendar.FRIDAY]="金";
  41. vec[Calendar.SATURDAY]="土";
  42. returnvec;
  43. }
  44. publicstaticStringgetWeekDayName(intiDay){
  45. returnvecStrWeekDayNames[iDay];
  46. }
  47. //fields
  48. privatefinalstaticString[]vecStrWeekDayNames=getWeekDayNames();
  49. //fields
  50. publicfinalstaticintiColorFrameHeader=0xff666666;
  51. publicfinalstaticintiColorFrameHeaderHoliday=0xff707070;
  52. publicfinalstaticintiColorTextHeader=0xffcccccc;
  53. publicfinalstaticintiColorTextHeaderHoliday=0xffd0d0d0;
  54. publicfinalstaticintiColorText=0xffdddddd;
  55. publicfinalstaticintiColorBkg=0xff888888;
  56. publicfinalstaticintiColorTextHoliday=0xfff0f0f0;
  57. publicfinalstaticintiColorBkgHoliday=0xffaaaaaa;
  58. publicfinalstaticintiColorTextToday=0xff002200;
  59. publicfinalstaticintiColorBkgToday=0xff88bb88;
  60. publicfinalstaticintiColorTextSelected=0xff001122;
  61. publicfinalstaticintiColorBkgSelectedLight=0xffbbddff;
  62. publicfinalstaticintiColorBkgSelectedDark=0xff225599;
  63. publicfinalstaticintiColorTextFocused=0xff221100;
  64. publicfinalstaticintiColorBkgFocusLight=0xffffddbb;
  65. publicfinalstaticintiColorBkgFocusDark=0xffaa5500;
  66. //methods
  67. publicstaticintgetColorFrameHeader(booleanbHoliday){
  68. if(bHoliday)
  69. returniColorFrameHeaderHoliday;
  70. returniColorFrameHeader;
  71. }
  72. publicstaticintgetColorTextHeader(booleanbHoliday){
  73. if(bHoliday)
  74. returniColorTextHeaderHoliday;
  75. returniColorTextHeader;
  76. }
  77. publicstaticintgetColorText(booleanbHoliday,booleanbToday){
  78. if(bToday)
  79. returniColorTextToday;
  80. if(bHoliday)
  81. returniColorTextHoliday;
  82. returniColorText;
  83. }
  84. publicstaticintgetColorBkg(booleanbHoliday,booleanbToday){
  85. if(bToday)
  86. returniColorBkgToday;
  87. if(bHoliday)
  88. returniColorBkgHoliday;
  89. returniColorBkg;
  90. }
  91. publicstaticintgetWeekDay(intindex,intiFirstDayOfWeek){
  92. intiWeekDay=-1;
  93. if(iFirstDayOfWeek==Calendar.MONDAY){
  94. iWeekDay=index+Calendar.MONDAY;
  95. if(iWeekDay>Calendar.SATURDAY)
  96. iWeekDay=Calendar.SUNDAY;
  97. }
  98. if(iFirstDayOfWeek==Calendar.SUNDAY){
  99. iWeekDay=index+Calendar.SUNDAY;
  100. }
  101. returniWeekDay;
  102. }
  103. }
package com.iaiai;

import java.util.Calendar;

/**
 * 
 * <p>
 * Title: DayStyle.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-19
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class DayStyle {
	// methods

	private static String[] getWeekDayNames() {
		String[] vec = new String[10];
		// vec[Calendar.SUNDAY] = "Sun";
		// vec[Calendar.MONDAY] = "Mon";
		// vec[Calendar.TUESDAY] = "Tue";
		// vec[Calendar.WEDNESDAY] = "Wed";
		// vec[Calendar.THURSDAY] = "Thu";
		// vec[Calendar.FRIDAY] = "Fri";
		// vec[Calendar.SATURDAY] = "Sat";

		vec[Calendar.SUNDAY] = "日";
		vec[Calendar.MONDAY] = "月";
		vec[Calendar.TUESDAY] = "火";
		vec[Calendar.WEDNESDAY] = "水";
		vec[Calendar.THURSDAY] = "木";
		vec[Calendar.FRIDAY] = "金";
		vec[Calendar.SATURDAY] = "土";
		return vec;
	}

	public static String getWeekDayName(int iDay) {
		return vecStrWeekDayNames[iDay];
	}

	// fields
	private final static String[] vecStrWeekDayNames = getWeekDayNames();

	// fields
	public final static int iColorFrameHeader = 0xff666666;
	public final static int iColorFrameHeaderHoliday = 0xff707070;
	public final static int iColorTextHeader = 0xffcccccc;
	public final static int iColorTextHeaderHoliday = 0xffd0d0d0;

	public final static int iColorText = 0xffdddddd;
	public final static int iColorBkg = 0xff888888;
	public final static int iColorTextHoliday = 0xfff0f0f0;
	public final static int iColorBkgHoliday = 0xffaaaaaa;

	public final static int iColorTextToday = 0xff002200;
	public final static int iColorBkgToday = 0xff88bb88;

	public final static int iColorTextSelected = 0xff001122;
	public final static int iColorBkgSelectedLight = 0xffbbddff;
	public final static int iColorBkgSelectedDark = 0xff225599;

	public final static int iColorTextFocused = 0xff221100;
	public final static int iColorBkgFocusLight = 0xffffddbb;
	public final static int iColorBkgFocusDark = 0xffaa5500;

	// methods
	public static int getColorFrameHeader(boolean bHoliday) {
		if (bHoliday)
			return iColorFrameHeaderHoliday;
		return iColorFrameHeader;
	}

	public static int getColorTextHeader(boolean bHoliday) {
		if (bHoliday)
			return iColorTextHeaderHoliday;
		return iColorTextHeader;
	}

	public static int getColorText(boolean bHoliday, boolean bToday) {
		if (bToday)
			return iColorTextToday;
		if (bHoliday)
			return iColorTextHoliday;
		return iColorText;
	}

	public static int getColorBkg(boolean bHoliday, boolean bToday) {
		if (bToday)
			return iColorBkgToday;
		if (bHoliday)
			return iColorBkgHoliday;
		return iColorBkg;
	}

	public static int getWeekDay(int index, int iFirstDayOfWeek) {
		int iWeekDay = -1;

		if (iFirstDayOfWeek == Calendar.MONDAY) {
			iWeekDay = index + Calendar.MONDAY;
			if (iWeekDay > Calendar.SATURDAY)
				iWeekDay = Calendar.SUNDAY;
		}

		if (iFirstDayOfWeek == Calendar.SUNDAY) {
			iWeekDay = index + Calendar.SUNDAY;
		}

		return iWeekDay;
	}

}


SymbolButton.java:
Java代码 复制代码 收藏代码
  1. packagecom.iaiai;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Paint;
  5. importandroid.graphics.RectF;
  6. importandroid.widget.Button;
  7. /**
  8. *
  9. *<p>
  10. *Title:SymbolButton.java
  11. *</p>
  12. *<p>
  13. *E-Mail:176291935@qq.com
  14. *</p>
  15. *<p>
  16. *QQ:176291935
  17. *</p>
  18. *<p>
  19. *Http:iaiai.iteye.com
  20. *</p>
  21. *<p>
  22. *Createtime:2011-8-19
  23. *</p>
  24. *
  25. *@author丸子
  26. *@version0.0.1
  27. */
  28. publicclassSymbolButtonextendsButton{
  29. //fields
  30. privatestaticfinalintiColor=0xffaaaaaa;
  31. privatestaticfinalintiColorActive=0xff442200;
  32. //fields
  33. publicenumsymbol{
  34. none,arrowLeft,arrowRight
  35. };
  36. //fields
  37. privatePaintpt=newPaint();
  38. privateRectFrect=newRectF();
  39. privateRectFrectDraw=newRectF();
  40. privatesymbolsymbolType=symbol.none;
  41. //methods
  42. publicSymbolButton(Contextcontext,symbolsymbolType){
  43. super(context);
  44. this.symbolType=symbolType;
  45. }
  46. @Override
  47. publicvoidonDraw(Canvascanvas){
  48. super.onDraw(canvas);
  49. pt.setAntiAlias(true);
  50. pt.setStrokeCap(Paint.Cap.ROUND);
  51. rectDraw.set(0,0,getWidth(),getHeight());
  52. rectDraw.left+=6;
  53. rectDraw.right-=6;
  54. rectDraw.top+=4;
  55. rectDraw.bottom-=8;
  56. if(symbolType!=symbol.none){
  57. pt.setStrokeWidth(5);
  58. pt.setColor(iColor);
  59. if(this.isPressed()||this.isFocused())
  60. pt.setColor(iColorActive);
  61. drawArrow(canvas);
  62. }
  63. }
  64. privatevoiddrawArrow(Canvascanvas){
  65. rect.set(rectDraw);
  66. rect.inset(15,5);
  67. canvas.drawLine(rect.left,rect.centerY(),rect.right,rect.centerY(),
  68. pt);
  69. if(symbolType==symbol.arrowRight){
  70. canvas.drawLine(rect.right,rect.centerY(),rect.right-6,
  71. rect.top,pt);
  72. canvas.drawLine(rect.right,rect.centerY(),rect.right-6,
  73. rect.bottom,pt);
  74. }
  75. if(symbolType==symbol.arrowLeft){
  76. canvas.drawLine(rect.left,rect.centerY(),rect.left+6,rect.top,
  77. pt);
  78. canvas.drawLine(rect.left,rect.centerY(),rect.left+6,
  79. rect.bottom,pt);
  80. }
  81. }
  82. }
package com.iaiai;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.widget.Button;

/**
 * 
 * <p>
 * Title: SymbolButton.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-19
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class SymbolButton extends Button {
	// fields
	private static final int iColor = 0xffaaaaaa;
	private static final int iColorActive = 0xff442200;

	// fields
	public enum symbol {
		none, arrowLeft, arrowRight
	};

	// fields
	private Paint pt = new Paint();
	private RectF rect = new RectF();
	private RectF rectDraw = new RectF();
	private symbol symbolType = symbol.none;

	// methods
	public SymbolButton(Context context, symbol symbolType) {
		super(context);
		this.symbolType = symbolType;
	}

	@Override
	public void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		pt.setAntiAlias(true);
		pt.setStrokeCap(Paint.Cap.ROUND);

		rectDraw.set(0, 0, getWidth(), getHeight());
		rectDraw.left += 6;
		rectDraw.right -= 6;
		rectDraw.top += 4;
		rectDraw.bottom -= 8;

		if (symbolType != symbol.none) {
			pt.setStrokeWidth(5);

			pt.setColor(iColor);
			if (this.isPressed() || this.isFocused())
				pt.setColor(iColorActive);

			drawArrow(canvas);
		}
	}

	private void drawArrow(Canvas canvas) {
		rect.set(rectDraw);
		rect.inset(15, 5);
		canvas.drawLine(rect.left, rect.centerY(), rect.right, rect.centerY(),
				pt);
		if (symbolType == symbol.arrowRight) {
			canvas.drawLine(rect.right, rect.centerY(), rect.right - 6,
					rect.top, pt);
			canvas.drawLine(rect.right, rect.centerY(), rect.right - 6,
					rect.bottom, pt);
		}
		if (symbolType == symbol.arrowLeft) {
			canvas.drawLine(rect.left, rect.centerY(), rect.left + 6, rect.top,
					pt);
			canvas.drawLine(rect.left, rect.centerY(), rect.left + 6,
					rect.bottom, pt);
		}
	}

}
  • 大小: 31.8 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值