一、概述

MaterialCalendarView是一个开源项目。功能强大支持多选、单选、标注等。

二、问题

1、其继承自ViewGroup,故与CalendarView半毛钱关系都没有,完全是一个新的类
2、其子类CalendarDay是经过调整的

1
2
3
4
CalendarDay date = new CalendarDay();
......
Log.e(LOG_TAG, "Date选中日期:" + date.getDate().getYear() + "-" + date.getDate().getMonth() + "-" + date.getDate().getDay());
Log.e(LOG_TAG, "Calendar选中日期:" + date.getCalendar().get(Calendar.YEAR) + "-" + (date.getCalendar().get(Calendar.MONTH) + 1) + "-" + date.getCalendar().get(Calendar.DAY_OF_MONTH));

得到的结果为

1
2
Date选中日期:116-3-6
Calendar选中日期:2016-4-30

即:

1
2
3
CalendarDay.getDate().getYear()得到的年份 = 真实年份 - 1900
CalendarDay.getDate().getMonth()得到的月份 = 真实年份 - 1
CalendarDay.getDate().getDay()得到的日 = 星期数 - 1

3、关于DayViewDecorator类
此类为抽象类,定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Decorate Day views with drawables and text manipulation
*/
public interface DayViewDecorator {
/**
* Determine if a specific day should be decorated
*
* @param day {@linkplain CalendarDay} to possibly decorate
* @return true if this decorator should be applied to the provided day
*/
boolean shouldDecorate(CalendarDay day);
/**
* Set decoration options onto a facade to be applied to all relevant days
*
* @param view View to decorate
*/
void decorate(DayViewFacade view);
}

实际使用时,只需实现上述两个方法即可,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class EventDecorator implements DayViewDecorator {
private final int color;
private final HashSet<CalendarDay> dates;
public EventDecorator(int color, Collection<CalendarDay> dates) {
this.color = color;
this.dates = new HashSet<>(dates);
}
@Override
public boolean shouldDecorate(CalendarDay day) {
return dates.contains(day);
}
@Override
public void decorate(DayViewFacade view) {
view.addSpan(new DotSpan(5, color));
}
}