最近有需要用户可以通过日历选择时间去预定,并且还要显示阴历日期节日等的需求,找了很多相关的开源的也没有发现类似功能的,有的是只有公历日期没有阴历,有的带有阴历的代码又看不懂(有些一句注释都没有,看的我蓝瘦香菇啊。。。 ( ╯□╰ )),没办法于是打算自己动手来写这样的功能。还是先来看一下效果图吧:

先来说说我的思路,我把它拆成了很多块,包括 该日历的整体界面,日历的单个月的界面,日历的单个月的行界面,以及单个日期的界面,类结构如下(看到名字大家应该清楚了),然后通过不断地new 进行嵌套进去,从而形成了现在看到的这样的布局:

这样做产生了一个严重的问题,就是程序第一次跑起来非常的卡,而且我担心GC会回收其中的View,从而造成BUG。但基本功能还是没多大问题,日期也是准确的。由于能力有限,这是我目前能想到的方法了,也希望各位看官能给我提供一些意见,小弟在此谢谢了(源码在最后。。。)。

再来说回代码上来,其中CellViewInstance.class 是用来替换用户当前点击后的CellView,点击之后进行状态切换。目前只做了单选的操作,你也可以在里面做多选事件的操作。LunarCalendar.class是用来根据公历日期来计算阴历日期,可以返回公历节日,阴历日期、节日、以及24节气。该方法是在网上找到的,做了一点点修改。

现在贴上主要代码,基本都有注释(顺序按布局从大到小  ----CustomCalendarView --> CalendarMonthView----> CalendarRowView --->  CalendarCellView ---> CellViewInstance):

CustomCalendarView.class:

public class CustomCalendarView extends RelativeLayout{/*** 展示的月份数量,默认为3(包含当前月份的三个月)*/private static int showMonths = 3;private Context context;protected LinearLayout weekStrLl;protected LinearLayout monthViewLl;private String[] weekString = new String[]{"日","一", "二", "三", "四", "五", "六"};public CustomCalendarView(Context context) {super(context);this.context = context;init();}private void init() {View calendarView = LayoutInflater.from(context).inflate(R.layout.custom_calendar_view,this);weekStrLl = (LinearLayout) calendarView.findViewById(R.id.calendar_view_week_ll);monthViewLl = (LinearLayout) calendarView.findViewById(R.id.calendar_view_month_ll);//设置顶部日期展示for(String week : weekString){TextView textView = new TextView(context);textView.setTextSize(22);if(week.equals("日") || week.equals("六")){textView.setTextColor(Color.parseColor("#44CDC5"));}else{textView.setTextColor(Color.parseColor("#333333"));}textView.setText(week);textView.setLayoutParams(new RelativeLayout.LayoutParams(CalendarActivity3.screenWidth / 7,ViewGroup.LayoutParams.MATCH_PARENT));textView.setGravity(Gravity.CENTER);weekStrLl.addView(textView);}//计算当前年月Calendar mCalendar = Calendar.getInstance();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月");for(int i = 0 ; i < showMonths ; i++){if(i == 0){mCalendar.add(Calendar.MONTH,0);}else{mCalendar.add(Calendar.MONTH,1);}String curDate = dateFormat.format(mCalendar.getTime());monthViewLl.addView(new CalendarMonthView(context,curDate));}}
}

j接下来是 CalendarMonthView.class

public class CalendarMonthView extends RelativeLayout {private Context context;private LinearLayout monthLl;private TextView curMonthTv;//根据日期去绘制一个月protected String curYearMonthStr;public CalendarMonthView(Context context, String curYearMonthStr) {super(context);this.context = context;this.curYearMonthStr = curYearMonthStr;init();}private void init() {View monthView = LayoutInflater.from(context).inflate(R.layout.calendar_month_view, this);monthLl = (LinearLayout) monthView.findViewById(R.id.calendar_month_ll);curMonthTv = (TextView) monthView.findViewById(R.id.calendar_month_tv);curMonthTv.setText(curYearMonthStr);//获得当月的天数int days = CalendarUtils.curMonthDays(curYearMonthStr);//第一行往旁边空出的格子数int startBlankCells = 0;//最后一行往旁边空出的格子数int endBlankCells = 0;try {//根据当月的第一天是星期几去算左边空出的格子数量int week = TimeUtils.dayForWeek(curYearMonthStr);startBlankCells = week % 7;} catch (Exception e) {e.printStackTrace();}//计算当月总的需要行数int mLines = (days + startBlankCells) / 7;//判断是否有余数int restDays = (days + startBlankCells) % 7;if (restDays > 0) {endBlankCells = 7 - restDays;//有的话行数加一mLines += 1;}//添加行以及数据//根据当月天数设置日期数据int date = 1;for (int i = 0; i < mLines; i++) {CalendarRowView rowView;List<Integer> dateList = new ArrayList<>();//第一行是特殊行,单独拿出来if (i == 0) {for(int j = 0 ;j < 7 ; j ++){if(j < startBlankCells){dateList.add(0);}else{dateList.add(date);date ++;}}rowView = new CalendarRowView(context,dateList,curYearMonthStr, startBlankCells, CalendarRowView.START_TAG);} else if (i < mLines - 1) {//绘制中间行//添加中间行日期for(int j = 0 ;j < 7 ; j ++){dateList.add(date);date ++;}rowView = new CalendarRowView(context,dateList,curYearMonthStr);} else {//最后一行也是特殊行,单独拿出来//最后一行日期for(int j = 0 ;j < 7 ; j ++){if((7 - j) <= endBlankCells){dateList.add(0);}else{dateList.add(date);date ++;}}rowView = new CalendarRowView(context,dateList,curYearMonthStr, endBlankCells, CalendarRowView.END_TAG);}monthLl.addView(rowView);}}
}

CalendarRowView.class

public class CalendarRowView extends RelativeLayout {private Context context;private LinearLayout rowLl;//往旁边空出几格private int blankCells;//起始处空出标识public static int START_TAG = 0x110;//结束处空出标识public static int END_TAG = 0x111;private int blankTag;private List<Integer> dataList;private String curYearMonthStr;public CalendarRowView(Context context,List<Integer> dataList,String curYearMonthStr) {super(context);this.context = context;this.dataList = dataList;this.curYearMonthStr = curYearMonthStr;init();}public CalendarRowView(Context context,List<Integer> dataList,String curYearMonthStr,int blankCells,int blankTag) {super(context);this.context = context;this.dataList = dataList;this.curYearMonthStr = curYearMonthStr;this.blankCells = blankCells;this.blankTag = blankTag;init();}private void init() {View rowView  = LayoutInflater.from(context).inflate(R.layout.calendar_row_view,this);rowLl = (LinearLayout) rowView.findViewById(R.id.calendar_row_ll);for(int i =0 ; i < 7 ; i ++){CalendarCellView cellView;int date = dataList.get(i);if(blankCells != 0){if(blankTag == START_TAG){//第一行cellView = new CalendarCellView(context,date,curYearMonthStr,true);blankCells --;}else{//最后一行,如果剩余的格子个数小于等于空白的数量则绘制空白if((7 - i) <= blankCells){cellView = new CalendarCellView(context,date,curYearMonthStr,true);}else{cellView = new CalendarCellView(context,date,curYearMonthStr);}}}else{cellView = new CalendarCellView(context,date,curYearMonthStr);}cellView.setLayoutParams(new LayoutParams(CalendarActivity3.screenWidth / 7,CalendarActivity3.screenWidth / 7));rowLl.addView(cellView);}}
}

CanlendarCellView.class

public class CalendarCellView extends RelativeLayout {private Context context;private TextView gregorianTv;private RelativeLayout gregorianRl;private TextView lunarTv;//当前cell选中状态private boolean isSelected;//当前cell能否被选中private boolean notBeChoosen;//为true则不显示布局private boolean isNull;private int date;private String curYearMonthStr;private CalendarCellView curCellView;public CalendarCellView(Context context,int date,String curYearMonthStr) {super(context);this.context = context;this.date = date;this.curYearMonthStr = curYearMonthStr;curCellView = this;init();}public CalendarCellView(Context context,int date,String curYearMonthStr,boolean isNull) {super(context);this.context = context;this.date = date;this.curYearMonthStr = curYearMonthStr;this.isNull = isNull;curCellView = this;init();}private void init(){View cellView  = LayoutInflater.from(context).inflate(R.layout.calendar_cell_view,this);gregorianTv = (TextView) cellView.findViewById(R.id.calendar_cell_gregorian_tv);lunarTv = (TextView) cellView.findViewById(R.id.calendar_cell_lunar_tv);gregorianRl = (RelativeLayout) cellView.findViewById(R.id.calendar_cell_gregorian_rl);if(isNull){gregorianTv.setVisibility(GONE);lunarTv.setVisibility(GONE);notBeChoosen = true;}else{gregorianTv.setText(String.valueOf(date));final String curDate = curYearMonthStr + date +"日";//如果日期是今天的话设为选中if(curDate.equals(TimeUtils.getCurrentDate())){CellViewInstance.setCellView(curCellView);gregorianTv.setBackgroundResource(R.drawable.ic_blue_round_border_bg);}//if(CellViewInstance.isCanBeChosen()){curCellView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {CellViewInstance.setCellView(curCellView);Toast.makeText(context,curDate,Toast.LENGTH_SHORT).show();}});}LunarCalendar lunarCalendar = LunarCalendar.getInstance();lunarCalendar.set(curDate);if(!lunarCalendar.getSolarFestival().equals("")){//设置公历节日lunarTv.setText(lunarCalendar.getSolarFestival());}else if(!lunarCalendar.getLunarFestival().equals("")){//设置阴历节日lunarTv.setText(lunarCalendar.getLunarFestival());}else if(!lunarCalendar.getSolarTerms().equals("")){//设置24节气lunarTv.setText(lunarCalendar.getSolarTerms());}else{//设置普通阴历日期lunarTv.setText(lunarCalendar.getLunarDate());lunarTv.setTextColor(Color.parseColor("#6D6D6D"));}}}/*** 设为选中*/public void setChecked(){if(!isSelected){gregorianTv.setTextColor(Color.parseColor("#FFFFFF"));gregorianRl.setBackgroundResource(R.drawable.ic_blue_round_bg);isSelected = true;}}/*** 设为未被选中*/public void setUnChecked(){if(isSelected){gregorianTv.setTextColor(Color.parseColor("#333333"));gregorianRl.setBackgroundColor(Color.TRANSPARENT);isSelected = false;}}/*** 设置公历日期*/public void setGregorianStr(String gregorianStr){gregorianTv.setText(gregorianStr);}/*** 设置阴历日期*/public void setLunarStr(String lunarStr){lunarTv.setText(lunarStr);}
}

CellViewInstance.class

/*** Created by fySpring* Date : 2016/12/29* To do :cellView 全局操作类,供用户点击操作,点击一次将其替换,也可作多选操作*/public class CellViewInstance {private static CalendarCellView cellView;//判断当前cell能否被选中private static boolean canBeChosen;public static CalendarCellView getCellView() {return cellView;}public static void setCellView(CalendarCellView cellView) {//如果为空则说明第一次进入该方法,表示为今天if(CellViewInstance.cellView  == null){canBeChosen = true;}else{CellViewInstance.cellView.setUnChecked();canBeChosen = false;}CellViewInstance.cellView = cellView;CellViewInstance.cellView.setChecked();}public static boolean isCanBeChosen() {return canBeChosen;}//当界面退出后清空instancepublic static void clearInstance(){CellViewInstance.cellView = null;canBeChosen = false;}
}

根据公历日期计算阴历日期的类  LunarCalendar.class

public class LunarCalendar {private int lyear;private int lmonth;private int lday;private boolean leap;private int yearCyl, monCyl, dayCyl;/*** 公历节气*/private String solarTerms = "";/*** 公历节日*/private String solarFestival = "";/*** 农历节日*/private String lunarFestival = "";/*** 农历日期*/private String lunarDate = "";private Calendar baseDate = Calendar.getInstance();private Calendar offDate = Calendar.getInstance();private 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[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己","庚", "辛", "壬", "癸" };final static String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳","午", "未", "申", "酉", "戌", "亥" };final static String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙","蛇", "马", "羊", "猴", "鸡", "狗", "猪" };final static String[] SolarTerm = new String[] { "小寒", "大寒", "立春", "雨水","惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋","处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };final static long[] STermInfo = new long[] { 0, 21208, 42467, 63836, 85337,107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343,285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795,462224, 483532, 504758 };final static String chineseMonthNumber[] = { "正", "二", "三", "四", "五", "六","七", "八", "九", "十", "冬", "腊" };final static String chineseNumber[] ={ "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };final static String[] sFtv = new String[] {"0101*元旦","0214 情人节", "0308 妇女节", "0312 植树节", "0401 愚人节","0501*劳动节", "0504 青年节", "0512 护士节", "0601 儿童节","0626 反毒品日","0701 建党节", "0801 建军节", "0910 教师节","1001*国庆节", "1031 万圣节", "1128 感恩节", "1225 圣诞节" };final static String[] lFtv = { "0101*春节", "0115 元宵", "0505 端午","0707 七夕", "0815 中秋", "0909 重阳", "1208 腊八", "1223 小年","0100*除夕" };final static String[] wFtv = { "0521 母亲节", "0631 父亲节" };//每年6月第3个星期日是父亲节,5月的第2个星期日是母亲节//星期日是一个周的第1天第3个星期日也就是第3个完整周的第一天//private LunarCalendar() {baseDate.setMinimalDaysInFirstWeek(7);//设置一个月的第一个周是一个完整周}/*** 获得实例* @return*/public static LunarCalendar getInstance() {return new LunarCalendar();}final private static int lYearDays(int y)//====== 传回农历 y年的总天数{int i, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {if ((lunarInfo[y - 1900] & i) != 0)sum += 1;}return (sum + leapDays(y));}final private static int leapDays(int y)//====== 传回农历 y年闰月的天数{if (leapMonth(y) != 0) {if ((lunarInfo[y - 1900] & 0x10000) != 0)return 30;elsereturn 29;} elsereturn 0;}final private static int leapMonth(int y)//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0{return (int) (lunarInfo[y - 1900] & 0xf);}final public static int monthDays(int y, int m)//====== 传回农历 y年m月的总天数{if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)return 29;elsereturn 30;}final private static String AnimalsYear(int y)//====== 传回农历 y年的生肖{return Animals[(y - 4) % 12];}final private static String cyclical(int num)//====== 传入 的offset 传回干支,// 0=甲子{return (Gan[num % 10] + Zhi[num % 12]);}//  ===== 某年的第n个节气为几日(从0小寒起算)final private int sTerm(int y, int n) {offDate.set(1900, 0, 6, 2, 5, 0);long temp = offDate.getTime().getTime();offDate.setTime(new Date((long) ((31556925974.7 * (y - 1900) + STermInfo[n] * 60000L) + temp)));return offDate.get(Calendar.DAY_OF_MONTH);}/*** 传出y年m月d日对应的农历.* @param curDate   例如 2016年12月29日*/private void CalculateLunarCalendar(String curDate) {int leapMonth;int y = 0;int m = 0;int d = 0;try {baseDate.setTime(chineseDateFormat.parse("1900年1月31日"));} catch (ParseException e) {e.printStackTrace();}long base = baseDate.getTimeInMillis();try {baseDate.setTime(chineseDateFormat.parse(curDate));Calendar calendar = Calendar.getInstance();calendar.setTime(chineseDateFormat.parse(curDate));y = calendar.get(Calendar.YEAR);m = calendar.get(Calendar.MONTH) + 1;d = calendar.get(Calendar.DATE);} catch (ParseException e) {e.printStackTrace();}long obj = baseDate.getTimeInMillis();int offset = (int) ((obj - base) / 86400000L);//求出和1900年1月31日相差的天数dayCyl = offset + 40;//干支天monCyl = 14;//干支月//用offset减去每农历年的天数// 计算当天是农历第几天//i最终结果是农历的年份//offset是当年的第几天int iYear, daysOfYear = 0;for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {daysOfYear = lYearDays(iYear);offset -= daysOfYear;monCyl += 12;}if (offset < 0) {offset += daysOfYear;iYear--;monCyl -= 12;}//农历年份lyear = iYear;yearCyl = iYear - 1864;//***********干支年**********//leapMonth = leapMonth(iYear); //闰哪个月,1-12leap = 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(iYear);} elsedaysOfMonth = monthDays(iYear, 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;}lmonth = iMonth;lday = offset + 1;/*** 计算阴历日期*/lunarDate = getChinaDayString(lday);/*** 计算24节气*/if (d == sTerm(y, (m - 1) * 2))solarTerms = SolarTerm[(m - 1) * 2];else if (d == sTerm(y, (m - 1) * 2 + 1))solarTerms = SolarTerm[(m - 1) * 2 + 1];elsesolarTerms = "";/*** 计算公历节日*/this.solarFestival = "";for (String ftv : sFtv) {if (Integer.parseInt(ftv.substring(0, 2)) == m&& Integer.parseInt(ftv.substring(2, 4)) == d) {solarFestival = ftv.substring(5);}}/*** 计算农历节日*/this.lunarFestival = "";for (String ftv : lFtv) {if (Integer.parseInt(ftv.substring(0, 2)) == lmonth&& Integer.parseInt(ftv.substring(2, 4)) == lday) {lunarFestival = ftv.substring(5);}}/*** 计算公历节日*/for (String ftv : wFtv) {if (Integer.parseInt(ftv.substring(0, 2)) == m &&Integer.parseInt(ftv.substring(2, 3)) == baseDate.get(Calendar.WEEK_OF_MONTH) &&Integer.parseInt(ftv.substring(3, 4)) == baseDate.get(Calendar.DAY_OF_WEEK)) {solarFestival += ftv.substring(5);}}}/*** 根据阴历日期计算阴历* @param day* @return*/private String getChinaDayString(int day) {String chineseTen[] ={ "初", "十", "廿", "卅" };int n = day % 10 == 0 ? 9 : day % 10 - 1;if (day > 30)return "";if (day == 10)return "初十";elsereturn chineseTen[day / 10] + chineseNumber[n];}public void set(String curDate) {CalculateLunarCalendar(curDate);}public String getSolarTerms() {return solarTerms;}public String getSolarFestival() {return solarFestival;}public String getLunarFestival() {return lunarFestival;}public String getLunarDate() {return lunarDate;}
}

主要代码就是这些,通过这次也明白了不要被眼前的障碍所吓倒,等你试着去解决他的时候才发现是多么的令人愉悦,尤其是开发这一块,越是不想去写越是得逼着自己去写,向着大神更靠近一步。最后也希望大家能够给我一些意见

源码点我点我

Android自定义预定日历,并且显示阴历相关推荐

  1. Android 自定义实现日历

    Android 自定义实现日历 开发工具AndroidStudio,使用组件GridView 实现步骤以及原理 具体实现 开发工具AndroidStudio,使用组件GridView 实现步骤以及原理 ...

  2. android自定义主题背景颜色,Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码...

    在最近的开发工作中,要实现一个调色板的进度条,SeekBar要分成10段显示不同颜色,功夫不负有心人,终于实现了这个功能,下面分享给大家 示例图: 1.自定义SeekBar import androi ...

  3. android日历价格控件,Android 自定义价格日历控件

    介绍 上个星期项目有一个日历价格的需求,类似一个商品在不同的日期价格可能会不同,由于时间给得特别紧所以打算找个合适的开源项目进行修改.参考了网上大多数是通过继承view直接draw一个monthVie ...

  4. android 自定义周日历,CalendarView

    CalenderView Android上一个非常优雅.高度自定义.性能高效的日历控件,完美支持周视图,支持标记.自定义颜色.农历等,任意控制月视图显示.任意日期拦截条件.自定义周起始等.Canvas ...

  5. Android自定义密码输入框(可显示或隐藏)

    先上效果图 1.首先在layout下新建xml文件 view_pas_edittext 主要控件为EditText和Button,其中Button存放闭眼的图片,其他样式自定(闭眼和眼睛两张图片可在阿 ...

  6. Android自定义日历控件,自带农历节假日,已经开源,即取即用~

    关注本人的更多博客:http://www.cnblogs.com/liushilin/ 该自定义日历控件已经开源:github地址 可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多, ...

  7. 自定义日历控android,Android自定义日历Calender代码实现

    产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的 ...

  8. android自定义选年控件,Android精美日历控件CalendarView自定义使用完全解析

    项目github地址 此框架采用组合的方式,各个模块互相独立,可自由采用各种提供的控件组合,完全自定义自己需要的UI,周视图和月视图可通过简单自定义任意自由绘制,不怕美工提需求!!!下面教程将介绍如何 ...

  9. android日历编程,Android自定义日历Calender代码实现

    产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的 ...

最新文章

  1. 代理(Proxy)及常见示例
  2. eclipse集成tomcat运行web时提示引入jar包的类找不到的解决办法
  3. 4G室内直放站_室内信号不太好,安装一个手机信号放大器,有效果吗?
  4. proxool配置详解
  5. webpack - 收藏集 - 掘金
  6. 存用部首查字典如何查_文献阅读技巧:牛人博士如何看文献!
  7. 学习pyhton: argparse模块
  8. Adversarial examples in the physical world论文解读
  9. ubuntu 在线安装最新交叉编译工具
  10. python画素描画_画画了,画画了,几行Python就成一幅素描画
  11. vue项目引入全局样式的几种方式
  12. sem_init函数用法
  13. 计算机毕业设计ssm+vue基本微信小程序的“香草屋”饮料奶茶点单小程序
  14. 计算机域是什么概念,什么是域?域的相关概念
  15. 针对win10激活出现的一系列问题解决方法
  16. php年会总结,2019年终总结(示例代码)
  17. 【ZZ】电影的格式及版本
  18. h5微信js-sdk分享接口php,H5 微信JSSDK自定义分享代码模板
  19. Unity3D 设置帧频及显示FPS
  20. 判断两条线段/直线相交,并求交点

热门文章

  1. mysql 5.6l安装教程,Mysql中MyISAM引擎和InnoDB引擎的比较
  2. Win32汇编--如何使用资源 [菜单和加速键]
  3. echarts(JavaScript)加载json的辛酸史
  4. 热血江湖数据库MYSQL修改_求更多热血江湖私服 修改数据库语句
  5. 上市公司板块其他分类
  6. MySQL restore报错的解决
  7. MRI基础知识以及AD
  8. 专家:高级口译考试之口语攻略
  9. 计算机格式设置实验,Word实验3 页面格式设置
  10. vba判断文件编码格式_[VBA]Excel输出utf-8编码格式文件 使用WideCharToMultiByte