- 3种常见日历交互方式,MIUI系统日历:miui9、miui10、华为emui,miui9和钉钉日历类似,华为emui和365日历类似
- 月周滑动切换
- 支持设置默认视图,默认周日历或者月日历
- 支持周状态固定,下拉刷新等
- 支持设置一周开始的是周一还是周日
- 可设置日期区间,默认区间从1901-01-01到2099-12-31
- 支持单独月日历和单独周日历默认不选中
- 支持农历,节气、法定节假日等
- 支持添加指示点及设置指示点位置
- 支持各种颜色、距离、位置等属性
- 支持日历和列表之间添加view
- 支持替换农历、颜色等
- 支持自定义日历页面
周固定,下拉刷新 |
日历和子view添加其他view |
自定义日历界面 |
|
|
|
下载demo
implementation 'com.necer.ncalendar:ncalendar:3.4.5'
miui9 和 钉钉日历
<com.necer.calendar.Miui9Calendar
android:id="@+id/miui9Calendar"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.necer.calendar.Miui9Calendar>
Miui10Calendar EmuiCalendar 用法类似
月日历
<com.necer.calendar.MonthCalendar
android:layout_width="match_parent"
app:todaySolarTextColor="#ff00ff"
app:selectCircleColor="#00c3aa"
app:hollowCircleColor="#00c3aa"
android:layout_height="300dp" />
周日历
<com.necer.calendar.WeekCalendar
android:layout_width="match_parent"
app:lunarTextColor="#00aa00"
android:layout_height="50dp" />
- NCalendar(Miui9Calendar、Miui10Calendar、EmuiCalendar)内部只能有一个子view,需要一个实现了
NestedScrollingChild
的子类,
如RecyclerView
,NestedScrollView
等,不必是直接子类,可以使用其他布局嵌套一个NestedScrollingChild
- 如果布局文件中,内部的子view有多个父view,恰好也有实现了
NestedScrollingChild
的父view,则需要给真实滑动的子view设置tag(“@string/factual_scroll_view”),不然可能会出现滑动异常,此种情况在下拉刷新中比较常见
- 单个的周日历和月日历可以设置默认不选中(即是点击才选中,不点击不选中),但是月周切换必须每页都选中
- 新版的代码已经将NestedScrollingChild2改成了NestedScrollingChild,如果出现滑动异常,则需要给实际滑动的view设置tag(“@string/factual_scroll_view”)
技术交流QQ群:127278900
NCalendar(包含Miui9Calendar、Miui10Calendar和EmuiCalendar)OnCalendarChangedListener 日期、月周状态变化回调
nCalendar.setOnCalendarChangedListener(new OnCalendarChangedListener() {
@Override
public void onCalendarDateChanged(NDate date,boolean isClick) {
//日历回调 NDate包含公历、农历、节气、节假日、闰年等信息
}
@Override
public void onCalendarStateChanged(boolean isMonthSate) {
//日历状态回调, 月->周 isMonthSate返回false ,反之返回true
}
});
其他回调
OnCalendarChangedListener //日期、月周状态变化回调(NCalendar)
OnClickDisableDateListener //点击区间之外的日期回调,如果不设置会弹出不可用提示(NCalendar、MonthCalendar、WeekCalendar)
OnMonthSelectListener //月日历默认选中时 日期选中回调(MonthCalendar)
OnWeekSelectListener //周日历默认选中时 日期选中回调(WeekCalendar)
OnYearMonthChangedListener //月日历,周日历默认不选中是翻页回调 年 月 (MonthCalendar、WeekCalendar)
参数为 yyyy-MM-dd 格式的日期
ncalendar.jumpDate("2017-12-31");
ncalendar.toWeek();
ncalendar.toMonth();
ncalendar.toNextPager();
ncalendar.toLastPager();
app:defaultCalendar="week" 默认周视图
app:defaultCalendar="month" 默认月视图
app:isWeekHold="true" 周视图固定,下拉刷新
app:startDate="2018-01-01" 开始日期
app:endDate="2018-12-31" 结束日期
或
setDateInterval(startFormatDate, endFormatDate)
setInitializeDate(formatDate)
setCalendarPainter(painter)
自定义的标签等,如果在初始化时设置不需要调用此方法,如果在初始化之后设置,需要调用此方法
notifyAllView()
此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现
List<String> pointList = Arrays.asList("2018-10-01", "2018-11-19", "2018-11-20", "2018-05-23", "2019-01-01");
InnerPainter innerPainter = (InnerPainter) miui10Calendar.getCalendarPainter();
innerPainter.setPointList(pointList);
此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现
List<String> holidayList = Arrays.asList("2018-10-01", "2018-11-19", "2018-11-20");
List<String> holidayList = Arrays.asList("2019-10-01", "2019-11-19", "2019-11-20");
InnerPainter innerPainter = (InnerPainter) miui10Calendar.getCalendarPainter();
innerPainter.setHolidayAndWorkdayList(holidayList,workdayList);
此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现
InnerPainter innerPainter = (InnerPainter) miui10Calendar.getCalendarPainter();
Map<String, String> strMap = new HashMap<>();
strMap.put("2019-01-25", "测试");
strMap.put("2019-01-23", "测试1");
strMap.put("2019-01-24", "测试2");
innerPainter.setReplaceLunarStrMap(strMap);
Map<String, Integer> colorMap = new HashMap<>();
colorMap.put("2019-01-25", Color.RED);
colorMap.put("2019-01-23", Color.GREEN);
colorMap.put("2019-01-24", Color.parseColor("#000000"));
innerPainter.setReplaceLunarColorMap(colorMap);
日历绘制接口,绘制的所有内容通过这个接口完成,实现这个类可实现自定义的日历界面,
参数中的 rect 是文字位置的矩形对象
日历内部内置了一个 InnerPainter ,各个属性也是这个绘制类的,如果自定义 CalendarPainter ,则这些属性都不适用
InnerPainter 实现了设置圆点、替换农历等方法,还可以实现更多方法,如多选,多标记等,
//绘制今天的日期,绘制选中状态和未选中状态
void onDrawToday(Canvas canvas, Rect rect, NDate nDate, boolean isSelect);
//绘制当前月(周)的日期
void onDrawCurrentMonthOrWeek(Canvas canvas, Rect rect, NDate nDate, boolean isSelect);
//绘制不是当月的日期,即上一月,下一月,周日历不用实现
void onDrawNotCurrentMonth(Canvas canvas, Rect rect, NDate nDate);
//绘制日期区间之外的日期,方法setDateInterval(startFormatDate, endFormatDate)对应
void onDrawDisableDate(Canvas canvas, Rect rect, NDate nDate);
实现接口 CalendarPainter,分别重写以上几个方法,setCalendarPainter(calendarPainter)即可实现自定义日历界面,
可以在自定义的CalendarPainter中实现,在绘制的时候判断条件绘制不同的内容,最后通过日历的notifyAllView()方法刷新即可
项目中日期计算使用 joda-time
农历和节气数据是工具类,多谢
Attributes |
forma |
describe |
solarTextColor |
color |
公历日期的颜色 |
lunarTextColor |
color |
农历日期的颜色 |
solarHolidayTextColor |
color |
公历节假日的颜色 |
lunarHolidayTextColor |
color |
农历节假日的颜色 |
solarTermTextColor |
color |
节气颜色 |
selectCircleColor |
color |
选中圈的颜色 |
holidayColor |
color |
法定节休息日颜色 |
workdayColor |
color |
法定节调休工作日颜色 |
bgEmuiCalendarColor |
color |
Emui日历的背景 |
bgChildColor |
color |
日历包含子view的背景 |
todaySelectContrastColor |
color |
今天被选中是其他元素的对比色,比如 农历,圆点等 |
pointColor |
color |
小圆点的颜色 |
startDate |
string |
日期区间开始日期 |
endDate |
string |
日期区间结束日期 |
alphaColor |
integer |
不是本月的日期颜色的透明度0-255 |
disabledAlphaColor |
integer |
日期区间之外的地日颜色的透明度0-255 |
disabledString |
string |
点击日期区间之外的日期提示语 |
todaySolarTextColor |
color |
今天不选中的颜色 |
todaySolarSelectTextColor |
color |
今天选中的颜色 |
selectCircleRadius |
dimension |
选中圈的半径 |
solarTextSize |
dimension |
公历日期字体大小 |
lunarTextSize |
dimension |
农历日期字体大小 |
lunarDistance |
dimension |
农历日期到公历字体的距离 |
holidayTextSize |
dimension |
法定节假日字体的大小 |
holidayDistance |
dimension |
法定节假日到公历的距离 |
pointDistance |
dimension |
小圆点到公历的距离 |
hollowCircleStroke |
dimension |
空心圆的宽度 |
calendarHeight |
dimension |
日历的高度 |
duration |
integer |
日历自动滑动的时间 |
isShowLunar |
boolean |
是否显示农历 |
isShowHoliday |
boolean |
是否显示法定节假日 |
isWeekHold |
boolean |
周状态是否固定,默认不固定 |
isDefaultSelect |
boolean |
是否默认选中(只对单个月日历或者周日历有效) |
defaultCalendar |
enum |
默认视图 week 或者 month |
pointLocation |
enum |
指示点的文职 up(在公历的上方) 或者 down(在公历的下方) 默认是up |
firstDayOfWeek |
enum |
一周开始的星期天还是星期一 sunday 或者 monday 默认是sunday |
holidayLocation |
enum |
法定节假日相对公历日期的位置 top_right(右上方)、top_left(左上方)、bottom_right(右下方)、bottom_left(左下方) |
- 3.4.5
修复id重复错误
- 3.4.4
修复未加载完成点击崩溃的问题
- 3.4.3
五月节假日调整
- 3.4.2
调整设置日历背景的方法,MIUI日历在xml文件中设置background属性,Emui日历使用用属性bgEmuiCalendarColor
- 3.4.1
增加替换农历文字、设置法定节假日等方法
- 3.3.3
修复5.0以下崩溃的问题
- 3.3.2
修复区间最后一天点击不回调
- 3.3.1
增加自定义绘制类Painter,实现自定义界面
- 3.2.5
调整默认未选中选中日期的逻辑
- 3.2.4
修改回调逻辑,区分翻页和点击,修改NestedScrollingChild2为NestedScrollingChild
- 3.2.3
增加设置滑动view的tag,方便查找NestedScrollingChild2
- 3.2.2
增加设置日历初始化日期的方法
- 3.2.1
设置日期区间
- 3.2.0
miui10完美了
- 3.1.5
更正2019年劳动节公休
- 3.1.4
增加toNextPager()和toLastPager()
- 3.1.3
修复Emui日历选中第一行下拉时周日历不消失的bug
- 3.1.2
修复初十的农历日期显示
- 3.1.1
修复当月跳转今天不回调