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

来源:互联网 发布:单片机仿真器 编辑:程序博客网 时间:2024/05/17 05:16
 运行结果:


此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. }  


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. }  


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. }  


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. }  


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. }  
  • 大小: 31.8 KB
  • 查看图片附件
原创粉丝点击