代码有点多,发个图先:
如果懒得往下看的,可以直接下载源码吧(0分的),最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下
http://download.csdn.net/detail/onlyonecoder/6574379
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/lay_title"
- style="@style/TitleStyle"
- android:layout_width="fill_parent" >
- <TextView
- android:id="@+id/btn_back"
- style="@style/TitleLeftButtonStyle" />
- <TextView
- android:id="@+id/tv_top"
- style="@style/TitleMiddleTextStyle"
- android:text="请选择日期" />
- <TextView
- android:id="@+id/btn_goback_to_today"
- style="@style/TitleRightButtonStyle"
- android:text="今天" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="53.0dip"
- android:background="#ff394147"
- android:gravity="center_vertical" >
- <LinearLayout
- android:id="@+id/btn_prev_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/left_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle06_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.6"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tv_month"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="xxxx年14月"
- android:textColor="#ffffffff"
- android:textSize="21.0dip" />
- </LinearLayout>
- <LinearLayout
- android:id="@+id/btn_next_month"
- android:layout_width="0.0dip"
- android:layout_height="fill_parent"
- android:layout_weight="0.2"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/right_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/triangle05_states"
- android:duplicateParentState="true"
- android:text=""
- android:textSize="16.0dip" />
- </LinearLayout>
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="22.0dip"
- android:background="#ff8091a8" >
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周日"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周一"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周二"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周三"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周四"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周五"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- <TextView
- android:layout_width="0.0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1.0"
- android:gravity="center"
- android:text="周六"
- android:textColor="#ffffffff"
- android:textSize="14.0dip" />
- </LinearLayout>
- <GridView
- android:id="@+id/gridview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#00000000"
- android:clickable="true"
- android:clipChildren="true"
- android:columnWidth="55.0dip"
- android:horizontalSpacing="1.0dip"
- android:listSelector="@null"
- android:numColumns="7"
- android:paddingBottom="1.0dip"
- android:stretchMode="columnWidth"
- android:verticalSpacing="1.0dip" />
- </LinearLayout>
Item:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="#FFFFFF"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:gravity="center"
- android:layout_width="46dp"
- android:layout_height="55dp"
- android:id="@+id/tvtext"
- />
- </LinearLayout><strong><span style="font-size:32px;color:#ff0000;">
- </span></strong>
Adapter:
- /**
- * 日历gridview中的每一个item显示的textview
- * @author lmw
- *
- */
- public class CalendarAdapter extends BaseAdapter {
- private boolean isLeapyear = false; //是否为闰年
- private int daysOfMonth = 0; //某月的天数
- private int dayOfWeek = 0; //具体某一天是星期几
- private int lastDaysOfMonth = 0; //上一个月的总天数
- private Context context;
- private String[] dayNumber = new String[42]; //一个gridview中的日期存入此数组中
- // private static String week[] = {"周日","周一","周二","周三","周四","周五","周六"};
- private SpecialCalendar sc = null;
- private LunarCalendar lc = null;
- private Resources res = null;
- private Drawable drawable = null;
- private String currentYear = "";
- private String currentMonth = "";
- private String currentDay = "";
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- private int currentFlag = -1; //用于标记当天
- private int[] schDateTagFlag = null; //存储当月所有的日程日期
- private String showYear = ""; //用于在头部显示的年份
- private String showMonth = ""; //用于在头部显示的月份
- private String animalsYear = "";
- private String leapMonth = ""; //闰哪一个月
- private String cyclical = ""; //天干地支
- //系统当前时间
- private String sysDate = "";
- private String sys_year = "";
- private String sys_month = "";
- private String sys_day = "";
- public CalendarAdapter(){
- Date date = new Date();
- sysDate = sdf.format(date); //当期日期
- sys_year = sysDate.split("-")[0];
- sys_month = sysDate.split("-")[1];
- sys_day = sysDate.split("-")[2];
- }
- public CalendarAdapter(Context context,Resources rs,int jumpMonth,int jumpYear,int year_c,int month_c,int day_c){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- int stepYear = year_c+jumpYear;
- int stepMonth = month_c+jumpMonth ;
- if(stepMonth > 0){
- //往下一个月滑动
- if(stepMonth%12 == 0){
- stepYear = year_c + stepMonth/12 -1;
- stepMonth = 12;
- }else{
- stepYear = year_c + stepMonth/12;
- stepMonth = stepMonth%12;
- }
- }else{
- //往上一个月滑动
- stepYear = year_c - 1 + stepMonth/12;
- stepMonth = stepMonth%12 + 12;
- if(stepMonth%12 == 0){
- }
- }
- currentYear = String.valueOf(stepYear);; //得到当前的年份
- currentMonth = String.valueOf(stepMonth); //得到本月 (jumpMonth为滑动的次数,每滑动一次就增加一月或减一月)
- currentDay = String.valueOf(day_c); //得到当前日期是哪天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- public CalendarAdapter(Context context,Resources rs,int year, int month, int day){
- this();
- this.context= context;
- sc = new SpecialCalendar();
- lc = new LunarCalendar();
- this.res = rs;
- currentYear = String.valueOf(year);; //得到跳转到的年份
- currentMonth = String.valueOf(month); //得到跳转到的月份
- currentDay = String.valueOf(day); //得到跳转到的天
- getCalendar(Integer.parseInt(currentYear),Integer.parseInt(currentMonth));
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return dayNumber.length;
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if(convertView == null){
- convertView = LayoutInflater.from(context).inflate(R.layout.calendar_item, null);
- }
- TextView textView = (TextView) convertView.findViewById(R.id.tvtext);
- String d = dayNumber[position].split("\\.")[0];
- String dv = dayNumber[position].split("\\.")[1];
- SpannableString sp = new SpannableString(d+"\n"+dv);
- sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- sp.setSpan(new RelativeSizeSpan(1.2f) , 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- if(dv != null ||dv != ""){
- sp.setSpan(new RelativeSizeSpan(0.75f), d.length()+1, dayNumber[position].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- // sp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 14, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
- textView.setText(sp);
- textView.setTextColor(Color.GRAY);
- // if(position<7){
- // //设置周
- // textView.setTextColor(Color.WHITE);
- // textView.setBackgroundColor(color.search_txt_color);
- // textView.setTextSize(14);
- // }
- if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) {
- // 当前月信息显示
- textView.setTextColor(Color.BLACK);// 当月字体设黑
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- }
- if(schDateTagFlag != null && schDateTagFlag.length >0){
- for(int i = 0; i < schDateTagFlag.length; i++){
- if(schDateTagFlag[i] == position){
- //设置日程标记背景
- textView.setBackgroundResource(R.drawable.mark);
- }
- }
- }
- if(currentFlag == position){
- //设置当天的背景
- drawable = res.getDrawable(R.drawable.current_day_bgc);
- textView.setBackgroundDrawable(drawable);
- textView.setTextColor(Color.WHITE);
- }
- return convertView;
- }
- //得到某年的某月的天数且这月的第一天是星期几
- public void getCalendar(int year, int month){
- isLeapyear = sc.isLeapYear(year); //是否为闰年
- daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的总天数
- dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天为星期几
- lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month-1); //上一个月的总天数
- Log.d("DAY", isLeapyear+" ====== "+daysOfMonth+" ============ "+dayOfWeek+" ========= "+lastDaysOfMonth);
- getweek(year,month);
- }
- //将一个月中的每一天的值添加入数组dayNuber中
- private void getweek(int year, int month) {
- int j = 1;
- int flag = 0;
- String lunarDay = "";
- //得到当前月的所有日程日期(这些日期需要标记)
- for (int i = 0; i < dayNumber.length; i++) {
- // 周一
- // if(i<7){
- // dayNumber[i]=week[i]+"."+" ";
- // }
- if(i < dayOfWeek){ //前一个月
- int temp = lastDaysOfMonth - dayOfWeek+1;
- lunarDay = lc.getLunarDate(year, month-1, temp+i,false);
- dayNumber[i] = (temp + i)+"."+lunarDay;
- }else if(i < daysOfMonth + dayOfWeek){ //本月
- String day = String.valueOf(i-dayOfWeek+1); //得到的日期
- lunarDay = lc.getLunarDate(year, month, i-dayOfWeek+1,false);
- dayNumber[i] = i-dayOfWeek+1+"."+lunarDay;
- //对于当前月才去标记当前日期
- if(sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)){
- //标记当前日期
- currentFlag = i;
- }
- setShowYear(String.valueOf(year));
- setShowMonth(String.valueOf(month));
- setAnimalsYear(lc.animalsYear(year));
- setLeapMonth(lc.leapMonth == 0?"":String.valueOf(lc.leapMonth));
- setCyclical(lc.cyclical(year));
- }else{ //下一个月
- lunarDay = lc.getLunarDate(year, month+1, j,false);
- dayNumber[i] = j+"."+lunarDay;
- j++;
- }
- }
- String abc = "";
- for(int i = 0; i < dayNumber.length; i++){
- abc = abc+dayNumber[i]+":";
- }
- Log.d("DAYNUMBER",abc);
- }
- public void matchScheduleDate(int year, int month, int day){
- }
- /**
- * 点击每一个item时返回item中的日期
- * @param position
- * @return
- */
- public String getDateByClickItem(int position){
- return dayNumber[position];
- }
- /**
- * 在点击gridView时,得到这个月中第一天的位置
- * @return
- */
- public int getStartPositon(){
- return dayOfWeek+7;
- }
- /**
- * 在点击gridView时,得到这个月中最后一天的位置
- * @return
- */
- public int getEndPosition(){
- return (dayOfWeek+daysOfMonth+7)-1;
- }
- public String getShowYear() {
- return showYear;
- }
- public void setShowYear(String showYear) {
- this.showYear = showYear;
- }
- public String getShowMonth() {
- return showMonth;
- }
- public void setShowMonth(String showMonth) {
- this.showMonth = showMonth;
- }
- public String getAnimalsYear() {
- return animalsYear;
- }
- public void setAnimalsYear(String animalsYear) {
- this.animalsYear = animalsYear;
- }
- public String getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(String leapMonth) {
- this.leapMonth = leapMonth;
- }
- public String getCyclical() {
- return cyclical;
- }
- public void setCyclical(String cyclical) {
- this.cyclical = cyclical;
- }
- }
计算类
- import java.util.Calendar;
- public class SpecialCalendar {
- private int daysOfMonth = 0; //某月的天数
- private int dayOfWeek = 0; //具体某一天是星期几
- // 判断是否为闰年
- public boolean isLeapYear(int year) {
- if (year % 100 == 0 && year % 400 == 0) {
- return true;
- } else if (year % 100 != 0 && year % 4 == 0) {
- return true;
- }
- return false;
- }
- //得到某月有多少天数
- public int getDaysOfMonth(boolean isLeapyear, int month) {
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- daysOfMonth = 31;
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- daysOfMonth = 30;
- break;
- case 2:
- if (isLeapyear) {
- daysOfMonth = 29;
- } else {
- daysOfMonth = 28;
- }
- }
- return daysOfMonth;
- }
- //指定某年中的某月的第一天是星期几
- public int getWeekdayOfMonth(int year, int month){
- Calendar cal = Calendar.getInstance();
- cal.set(year, month-1, 1);
- dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;
- return dayOfWeek;
- }
- }
节日和阴历计算类
关于日历实现代码里0x04bd8, 0x04ae0, 0x0a570的解释:
http://blog.csdn.net/onlyonecoder/article/details/8484118
- public class LunarCalendar {
- private int year; //农历的年份
- private int month;
- private int day;
- private String lunarMonth; //农历的月份
- private boolean leap;
- public int leapMonth = 0; //闰的是哪个月
- final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七",
- "八", "九", "十", "十一", "十二" };
- static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
- "yyyy年MM月dd日");
- final static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570,
- 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
- 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
- 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
- 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
- 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0,
- 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4,
- 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550,
- 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
- 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
- 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
- 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
- 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40,
- 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3,
- 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960,
- 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0,
- 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
- 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0,
- 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65,
- 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0,
- 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
- 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
- //农历部分假日
- final static String[] lunarHoliday = new String[]{
- "0101 春节",
- "0115 元宵",
- "0505 端午",
- "0707 七夕情人",
- "0715 中元",
- "0815 中秋",
- "0909 重阳",
- "1208 腊八",
- "1224 小年",
- "0100 除夕"
- };
- //公历部分节假日
- final static String[] solarHoliday = new String[]{
- "0101 元旦",
- "0214 情人",
- "0308 妇女",
- "0312 植树",
- "0315 消费者权益日",
- "0401 愚人",
- "0501 劳动",
- "0504 青年",
- "0512 护士",
- "0601 儿童",
- "0701 建党",
- "0801 建军",
- "0808 父亲",
- "0909 XXX逝世纪念",
- "0910 教师",
- "0928 孔子诞辰",
- "1001 国庆",
- "1006 老人",
- "1024 联合国日",
- "1112 孙中山诞辰纪念",
- "1220 澳门回归纪念",
- "1225 圣诞",
- "1226 XXX诞辰纪念"
- };
- // ====== 传回农历 y年的总天数
- final private static int yearDays(int y) {
- int i, sum = 348;
- for (i = 0x8000; i > 0x8; i >>= 1) {
- if ((lunarInfo[y - 1900] & i) != 0)
- sum += 1;
- }
- return (sum + leapDays(y));
- }
- // ====== 传回农历 y年闰月的天数
- final private static int leapDays(int y) {
- if (leapMonth(y) != 0) {
- if ((lunarInfo[y - 1900] & 0x10000) != 0)
- return 30;
- else
- return 29;
- } else
- return 0;
- }
- // ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
- final private static int leapMonth(int y) {
- return (int) (lunarInfo[y - 1900] & 0xf);
- }
- // ====== 传回农历 y年m月的总天数
- final private static int monthDays(int y, int m) {
- if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
- return 29;
- else
- return 30;
- }
- // ====== 传回农历 y年的生肖
- final public String animalsYear(int year) {
- final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇",
- "马", "羊", "猴", "鸡", "狗", "猪" };
- return Animals[(year - 4) % 12];
- }
- // ====== 传入 月日的offset 传回干支, 0=甲子
- final private static String cyclicalm(int num) {
- final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",
- "辛", "壬", "癸" };
- final String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午",
- "未", "申", "酉", "戌", "亥" };
- return (Gan[num % 10] + Zhi[num % 12]);
- }
- // ====== 传入 offset 传回干支, 0=甲子
- final public String cyclical(int year) {
- int num = year - 1900 + 36;
- return (cyclicalm(num));
- }
- public static String getChinaDayString(int day) {
- String chineseTen[] = { "初", "十", "廿", "卅" };
- int n = day % 10 == 0 ? 9 : day % 10 - 1;
- if (day > 30)
- return "";
- if (day == 10)
- return "初十";
- else
- return chineseTen[day / 10] + chineseNumber[n];
- }
- /** */
- /**
- * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数
- * dayCyl5:与1900年1月31日相差的天数,再加40 ?
- *
- * isday: 这个参数为false---日期为节假日时,阴历日期就返回节假日 ,true---不管日期是否为节假日依然返回这天对应的阴历日期
- * @param cal
- * @return
- */
- public String getLunarDate(int year_log, int month_log, int day_log, boolean isday) {
- // @SuppressWarnings("unused")
- int yearCyl, monCyl, dayCyl;
- //int leapMonth = 0;
- String nowadays;
- Date baseDate = null;
- Date nowaday = null;
- try {
- baseDate = chineseDateFormat.parse("1900年1月31日");
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- nowadays = year_log + "年" + month_log + "月" + day_log + "日";
- try {
- nowaday = chineseDateFormat.parse(nowadays);
- } catch (ParseException e) {
- e.printStackTrace(); // To change body of catch statement use
- // Options | File Templates.
- }
- // 求出和1900年1月31日相差的天数
- int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
- dayCyl = offset + 40;
- monCyl = 14;
- // 用offset减去每农历年的天数
- // 计算当天是农历第几天
- // i最终结果是农历的年份
- // offset是当年的第几天
- int iYear, daysOfYear = 0;
- for (iYear = 1900; iYear < 10000 && offset > 0; iYear++) {
- daysOfYear = yearDays(iYear);
- offset -= daysOfYear;
- monCyl += 12;
- }
- if (offset < 0) {
- offset += daysOfYear;
- iYear--;
- monCyl -= 12;
- }
- // 农历年份
- year = iYear;
- setYear(year); //设置公历对应的农历年份
- yearCyl = iYear - 1864;
- leapMonth = leapMonth(iYear); // 闰哪个月,1-12
- leap = false;
- // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
- int iMonth, daysOfMonth = 0;
- for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
- // 闰月
- if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
- --iMonth;
- leap = true;
- daysOfMonth = leapDays(year);
- } else
- daysOfMonth = monthDays(year, iMonth);
- offset -= daysOfMonth;
- // 解除闰月
- if (leap && iMonth == (leapMonth + 1))
- leap = false;
- if (!leap)
- monCyl++;
- }
- // offset为0时,并且刚才计算的月份是闰月,要校正
- if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
- if (leap) {
- leap = false;
- } else {
- leap = true;
- --iMonth;
- --monCyl;
- }
- }
- // offset小于0时,也要校正
- if (offset < 0) {
- offset += daysOfMonth;
- --iMonth;
- --monCyl;
- }
- month = iMonth;
- setLunarMonth(chineseNumber[month - 1] + "月"); //设置对应的阴历月份
- day = offset + 1;
- if(!isday){
- //如果日期为节假日则阴历日期则返回节假日
- //setLeapMonth(leapMonth);
- for(int i = 0; i < solarHoliday.length; i++){
- //返回公历节假日名称
- String sd = solarHoliday[i].split(" ")[0]; //节假日的日期
- String sdv = solarHoliday[i].split(" ")[1]; //节假日的名称
- String smonth_v = month_log+"";
- String sday_v = day_log+"";
- String smd = "";
- if(month_log < 10){
- smonth_v = "0"+month_log;
- }
- if(day_log < 10){
- sday_v = "0"+day_log;
- }
- smd = smonth_v+sday_v;
- if(sd.trim().equals(smd.trim())){
- return sdv;
- }
- }
- for(int i = 0; i < lunarHoliday.length; i++){
- //返回农历节假日名称
- String ld =lunarHoliday[i].split(" ")[0]; //节假日的日期
- String ldv = lunarHoliday[i].split(" ")[1]; //节假日的名称
- String lmonth_v = month+"";
- String lday_v = day+"";
- String lmd = "";
- if(month < 10){
- lmonth_v = "0"+month;
- }
- if(day < 10){
- lday_v = "0"+day;
- }
- lmd = lmonth_v+lday_v;
- if(ld.trim().equals(lmd.trim())){
- return ldv;
- }
- }
- }
- if (day == 1)
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- }
- public String toString() {
- if (chineseNumber[month - 1] == "一" && getChinaDayString(day) == "初一")
- return "农历" + year + "年";
- else if (getChinaDayString(day) == "初一")
- return chineseNumber[month - 1] + "月";
- else
- return getChinaDayString(day);
- // return year + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] +
- // "月" + getChinaDayString(day);
- }
- /*public static void main(String[] args) {
- System.out.println(new LunarCalendar().getLunarDate(2012, 1, 23));
- }*/
- public int getLeapMonth() {
- return leapMonth;
- }
- public void setLeapMonth(int leapMonth) {
- this.leapMonth = leapMonth;
- }
- /**
- * 得到当前日期对应的阴历月份
- * @return
- */
- public String getLunarMonth() {
- return lunarMonth;
- }
- public void setLunarMonth(String lunarMonth) {
- this.lunarMonth = lunarMonth;
- }
- /**
- * 得到当前年对应的农历年份
- * @return
- */
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- }
Activity
- /**
- * 日历显示activity
- *
- *
- */
- public class CalendarActivity extends Activity implements OnGestureListener {
- private GestureDetector gestureDetector = null;
- private CalendarAdapter calV = null;
- private GridView gridView = null;
- private TextView topText = null;
- private static int jumpMonth = 0; //每次滑动,增加或减去一个月,默认为0(即显示当前月)
- private static int jumpYear = 0; //滑动跨越一年,则增加或者减去一年,默认为0(即当前年)
- private int year_c = 0;
- private int month_c = 0;
- private int day_c = 0;
- private String currentDate = "";
- private Bundle bd=null;//发送参数
- private Bundle bun=null;//接收参数
- private String ruzhuTime;
- private String lidianTime;
- private String state="";
- public CalendarActivity() {
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
- currentDate = sdf.format(date); //当期日期
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivityList.activityList.add(this);
- setContentView(R.layout.calendar);
- bd=new Bundle();//out
- bun=getIntent().getExtras();//in
- if(bun!=null&&bun.getString("state").equals("ruzhu"))
- {
- state=bun.getString("state");
- System.out.println("%%%%%%"+state);
- }else if(bun!=null&&bun.getString("state").equals("lidian")){
- state=bun.getString("state");
- System.out.println("|||||||||||"+state);
- }
- gestureDetector = new GestureDetector(this);
- // bd=new Bundle();
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- addGridView();
- gridView.setAdapter(calV);
- topText = (TextView) findViewById(R.id.tv_month);
- addTextToTopTextView(topText);
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int gvFlag = 0; //每次添加gridview到viewflipper中时给的标记
- if (e1.getX() - e2.getX() > 120) {
- //像左滑动
- addGridView(); //添加一个gridView
- jumpMonth++; //下一个月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- return true;
- } else if (e1.getX() - e2.getX() < -120) {
- //向右滑动
- addGridView(); //添加一个gridView
- jumpMonth--; //上一个月
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- gvFlag++;
- addTextToTopTextView(topText);
- return true;
- }
- return false;
- }
- /**
- * 创建菜单
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(0, menu.FIRST, menu.FIRST, "今天");
- return super.onCreateOptionsMenu(menu);
- }
- /**
- * 选择菜单
- */
- @Override
- public boolean onMenuItemSelected(int featureId, MenuItem item) {
- switch (item.getItemId()){
- case Menu.FIRST:
- //跳转到今天
- int xMonth = jumpMonth;
- int xYear = jumpYear;
- int gvFlag =0;
- jumpMonth = 0;
- jumpYear = 0;
- addGridView(); //添加一个gridView
- year_c = Integer.parseInt(currentDate.split("-")[0]);
- month_c = Integer.parseInt(currentDate.split("-")[1]);
- day_c = Integer.parseInt(currentDate.split("-")[2]);
- calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
- gridView.setAdapter(calV);
- addTextToTopTextView(topText);
- gvFlag++;
- break;
- }
- return super.onMenuItemSelected(featureId, item);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return this.gestureDetector.onTouchEvent(event);
- }
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- //添加头部的年份 闰哪月等信息
- public void addTextToTopTextView(TextView view){
- StringBuffer textDate = new StringBuffer();
- textDate.append(calV.getShowYear()).append("年").append(
- calV.getShowMonth()).append("月").append("\t");
- view.setText(textDate);
- view.setTextColor(Color.WHITE);
- view.setTypeface(Typeface.DEFAULT_BOLD);
- }
- //添加gridview
- private void addGridView() {
- gridView =(GridView)findViewById(R.id.gridview);
- gridView.setOnTouchListener(new OnTouchListener() {
- //将gridview中的触摸事件回传给gestureDetector
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- return CalendarActivity.this.gestureDetector.onTouchEvent(event);
- }
- });
- gridView.setOnItemClickListener(new OnItemClickListener() {
- //gridView中的每一个item的点击事件
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- //点击任何一个item,得到这个item的日期(排除点击的是周日到周六(点击不响应))
- int startPosition = calV.getStartPositon();
- int endPosition = calV.getEndPosition();
- if(startPosition <= position+7 && position <= endPosition-7){
- String scheduleDay = calV.getDateByClickItem(position).split("\\.")[0]; //这一天的阳历
- //String scheduleLunarDay = calV.getDateByClickItem(position).split("\\.")[1]; //这一天的阴历
- String scheduleYear = calV.getShowYear();
- String scheduleMonth = calV.getShowMonth();
- // Toast.makeText(CalendarActivity.this, scheduleYear+"-"+scheduleMonth+"-"+scheduleDay, 2000).show();
- ruzhuTime=scheduleMonth+"月"+scheduleDay+"日";
- lidianTime=scheduleMonth+"月"+scheduleDay+"日";
- Intent intent=new Intent();
- if(state.equals("ruzhu"))
- {
- bd.putString("ruzhu", ruzhuTime);
- System.out.println("ruzhuuuuuu"+bd.getString("ruzhu"));
- }else if(state.equals("lidian")){
- bd.putString("lidian", lidianTime);
- }
- intent.setClass(CalendarActivity.this, HotelActivity.class);
- intent.putExtras(bd);
- startActivity(intent);
- finish();
- }
- }
- });
- }
- }