github地址:https://github.com/huanghaibin-dev/CalendarView
插拔式设计:好比插座一样,插上灯泡就会亮,插上风扇就会转,看用户需求什么而不是看插座有什么,只要是电器即可。此框架使用插拔式,既可以在编译时指定年月日视图,如:app:month_view="xxx.xxx.MonthView.class",也可在运行时动态更换年月日视图,如:CalendarView.setMonthViewClass(MonthView.Class),从而达到UI即插即用的效果,相当于框架不提供UI实现,让UI都由客户端实现,不至于日历UI都千篇一律,只需遵守插拔式接口即可随意定制,自由化程度非常高。
/** * 定制高仿魅族日历界面,按你的想象力绘制出各种各样的界面 * */ public class MeiZuMonthView extends MonthView { /** * 绘制选中的日子 * * @param canvas canvas * @param calendar 日历日历calendar * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 * @param hasScheme hasScheme 非标记的日期 * @return 返回true 则绘制onDrawScheme,因为这里背景色不是是互斥的,所以返回true */ @Override protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { //这里绘制选中的日子样式,看需求需不需要继续调用onDrawScheme return true; } /** * 绘制标记的事件日子 * * @param canvas canvas * @param calendar 日历calendar * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 */ @Override protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { //这里绘制标记的日期样式,想怎么操作就怎么操作 } /** * 绘制文本 * * @param canvas canvas * @param calendar 日历calendar * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { //这里绘制文本,不要再问我怎么隐藏农历了,不要再问我怎么把某个日期换成特殊字符串了,要怎么显示你就在这里怎么画,你不画就不显示,是看你想怎么显示日历的,而不是看框架 } }
app:month_view="com.haibin.calendarviewproject.MeiZuMonthView" app:week_view="com.haibin.calendarviewproject.MeiZuWeekView"
如果继承这2个,MonthView、WeekView,即select_mode="default_mode",这是默认的手机自带的日历模式,会自动选择月的第一天,不支持拦截器, 也可以设置select_mode="single_mode",即单选模式,支持拦截器 如果继承这2个,RangeMonthView、RangeWeekView,即select_mode="range_mode",这是范围选择模式,支持拦截器 如果继承这2个,MultiMonthView、MultiWeekView,即select_mode="multi_mode",这是多选模式,支持拦截器
mCalendarView.setWeekView(MeiZuWeekView.class); mCalendarView.setMonthView(MeiZuMonthView.class);
public void setOnViewChangeListener(OnViewChangeListener listener);
CalendarView.scrollToCalendar();
CalendarView.scrollToNext();
CalendarView.scrollToPre();
CalendarView.scrollToXXX();
app:week_start_with="mon、sun、sat"
CalendarView.setWeekStarWithSun();
CalendarView.setWeekStarWithMon();
CalendarView.setWeekStarWithSat();
public class CustomRangeMonthView extends RangeMonthView{ } public class CustomRangeWeekView extends RangeWeekView{ }
然后你需要设置选择模式为范围模式:select_mode="range_mode"
酒店式日历场景当然是不能从昨天开始订房的,也不能无限期订房,所以你需要静态或动态设置日历范围、精确到具体某一天!!!
CalendarView.setRange(int minYear, int minYearMonth, int minYearDay,
int maxYear, int maxYearMonth, int maxYearDay)
//设置日期拦截事件 mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() { @Override public boolean onCalendarIntercept(Calendar calendar) { //这里写拦截条件,返回true代表拦截,尽量以最高效的代码执行 return calendar.isWeekend(); } @Override public void onCalendarInterceptClick(Calendar calendar, boolean isClick) { //todo 点击拦截的日期回调 } });
boolean isInRange = isInRange(calendar);//日期是否在范围内,超出范围的可以置灰 boolean isEnable = !onCalendarIntercept(calendar);//日期是否可用,没有被拦截,被拦截的可以置灰
也许你只需要像原生日历那样就够了,但原生日历那奇怪且十分不友好的style,受到theme的影响,各种头疼,使用此控件,你只需要简简单单定制月视图就够了,CalendarView 能非常简单就高仿各种日历UI
CalendarView 提供了 setSchemeDate(Map
日历类 Calendar 提供了许多十分有用的API
boolean isWeekend();//判断是不是周末,可以用不同的画笔绘制周末的样式 int getWeek();//获取星期 String getSolarTerm();//获取24节气,可以用不同颜色标记不同节日 String getGregorianFestival();//获取公历节日,自由判断,把节日换上喜欢的颜色 String getTraditionFestival();//获取传统节日 boolean isLeapYear();//是否是闰年 int getLeapMonth();//获取闰月 boolean isSameMonth(Calendar calendar);//是否相同月 int compareTo(Calendar calendar);//比较日期大小 -1 0 1 long getTimeInMillis();//获取时间戳 int differ(Calendar calendar);//日期运算,相差多少天