編輯:關於Android編程
Android使用GridView實現日歷功能示例,代碼有點多,發個圖先:
如果懶得往下看的,可以直接下載源碼吧,最近一直有人要,由於時間太久了,懶得找出來整理,今天又看到有人要,正好沒事就整理了一下
源碼下載。。。。
布局文件:
<?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" android:layout_width="fill_parent" > <TextView android:id="@+id/btn_back" /> <TextView android:id="@+id/tv_top" android:text="請選擇日期" /> <TextView android:id="@+id/btn_goback_to_today" 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>
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的解釋:
new Array( 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,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0, 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0, 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,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, 0x14b63);
正確的解釋是:
二進制形式
xxxx xxxx xxxx xxxx xxxx
20-17 16-12 12-9 8-5 4-1
1-4: 表示當年有無閏年,有的話,為閏月的月份,沒有的話,為0。
5-16:為除了閏月外的正常月份是大月還是小月,1為30天,0為29天。
注意:從1月到12月對應的是第16位到第5位。
17-20: 表示閏月是大月還是小月,僅當存在閏月的情況下有意義。
舉個例子:
1980年的數據是: 0x095b0
二進制:0000 1001 0101 1011 0000
表示1980年沒有閏月,從1月到12月的天數依次為:30、29、29、30 、29、30、29、30、 30、29、30、30。
1982年的數據是:0x0a974
0000 1010 0 1001 0111 0100
表示1982年的4月為閏月,即有第二個4月,且是閏小月。
從1月到13月的天數依次為:30、29、30、29、 29(閏月)、 30、29、29、30、 29、30、30、30。
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 毛澤東逝世紀念", "0910 教師", "0928 孔子誕辰", "1001 國慶", "1006 老人", "1024 聯合國日", "1112 孫中山誕辰紀念", "1220 澳門回歸紀念", "1225 聖誕", "1226 毛澤東誕辰紀念" }; // ====== 傳回農歷 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(); } } }); } }
源碼下載。。。。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
前言在Android開發中, 我們經常會遇到一些場景, 需要以一些特殊的形狀顯示圖片, 比如圓角矩形、圓形等等。關於如何繪制這類形狀, 網上已經有很多的方案,比如自定義控
C++ LooperLooperLooper類[system/core/libutils/Looper.cpp]提供了pollOnce(),wake()函數來完成睡眠等待
在Android開發中,事件分發機制是一塊Android比較重要的知識體系,了解並熟悉整套的分發機制有助於更好的分析各種點擊滑動失效問題,更好去擴展控件的事件功能和開發自
手機QQ2015安卓版最近有了一個很大的更新,我們會驚奇的發現自己的手機QQ2015軟件無論是在軟件功能上還是軟件界面上都有了很大的變化,頁面的布置跟以前有