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.   
  16. /**  
  17.  *   
  18.  * <p>  
  19.  * Title: DateWidget.java  
  20.  * </p>  
  21.  * <p>  
  22.  * E-Mail: 176291935@qq.com  
  23.  * </p>  
  24.  * <p>  
  25.  * QQ: 176291935  
  26.  * </p>  
  27.  * <p>  
  28.  * Http: iaiai.iteye.com  
  29.  * </p>  
  30.  * <p>  
  31.  * Create time: 2011-8-19  
  32.  * </p>  
  33.  *   
  34.  * @author 丸子  
  35.  * @version 0.0.1  
  36.  */  
  37. public class DateWidget extends Activity {   
  38.     private ArrayList<DateWidgetDayCell> days = new ArrayList<DateWidgetDayCell>();   
  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;   
  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) {   
  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);   
  142.         layTopControls.addView(btnToday);   
  143.         layTopControls.addView(btnNext);   
  144.     }   
  145.   
  146.     private View generateContentView() {   
  147.         LinearLayout layMain = createLayout(LinearLayout.VERTICAL);   
  148.         layMain.setPadding(8888);   
  149.         LinearLayout layTopControls = createLayout(LinearLayout.HORIZONTAL);   
  150.   
  151.         layContent = createLayout(LinearLayout.VERTICAL);   
  152.         layContent.setPadding(200200);   
  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.     }   
  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)   
  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;   
  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);   
  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. }  
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. 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;   
  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.   
  18. /**  
  19.  *   
  20.  * <p>  
  21.  * Title: DateWidgetDayCell.java  
  22.  * </p>  
  23.  * <p>  
  24.  * E-Mail: 176291935@qq.com  
  25.  * </p>  
  26.  * <p>  
  27.  * QQ: 176291935  
  28.  * </p>  
  29.  * <p>  
  30.  * Http: iaiai.iteye.com  
  31.  * </p>  
  32.  * <p>  
  33.  * Create time: 2011-8-19  
  34.  * </p>  
  35.  *   
  36.  * @author 丸子  
  37.  * @version 0.0.1  
  38.  */  
  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));   
  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.   
  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(00this.getWidth(), this.getHeight());   
  151.         rect.inset(11);   
  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) {   
  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())   
  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;   
  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. }  
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. 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.   
  12. /**  
  13.  *   
  14.  * <p>  
  15.  * Title: DateWidgetDayHeader.java  
  16.  * </p>  
  17.  * <p>  
  18.  * E-Mail: 176291935@qq.com  
  19.  * </p>  
  20.  * <p>  
  21.  * QQ: 176291935  
  22.  * </p>  
  23.  * <p>  
  24.  * Http: iaiai.iteye.com  
  25.  * </p>  
  26.  * <p>  
  27.  * Create time: 2011-8-19  
  28.  * </p>  
  29.  *   
  30.  * @author 丸子  
  31.  * @version 0.0.1  
  32.  */  
  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.     }   
  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(00this.getWidth(), this.getHeight());   
  91.         rect.inset(11);   
  92.   
  93.         // drawing   
  94.         drawDayHeader(canvas);   
  95.     }   
  96.   
  97. }  
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. package com.iaiai;   
  2.   
  3. import java.util.Calendar;   
  4.   
  5. /**  
  6.  *   
  7.  * <p>  
  8.  * Title: DayStyle.java  
  9.  * </p>  
  10.  * <p>  
  11.  * E-Mail: 176291935@qq.com  
  12.  * </p>  
  13.  * <p>  
  14.  * QQ: 176291935  
  15.  * </p>  
  16.  * <p>  
  17.  * Http: iaiai.iteye.com  
  18.  * </p>  
  19.  * <p>  
  20.  * Create time: 2011-8-19  
  21.  * </p>  
  22.  *   
  23.  * @author 丸子  
  24.  * @version 0.0.1  
  25.  */  
  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;   
  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;   
  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. }  
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. 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.   
  9. /**  
  10.  *   
  11.  * <p>  
  12.  * Title: SymbolButton.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.  * Create time: 2011-8-19  
  25.  * </p>  
  26.  *   
  27.  * @author 丸子  
  28.  * @version 0.0.1  
  29.  */  
  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();   
  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(00, 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(155);   
  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) {   
  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. }  
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值