Home

Awesome

安卓日历 NCalendar

特点:

效果图

效果1效果2效果3
周固定,下拉刷新日历和子view添加其他view自定义日历界面(LigaturePainter)
默认不选中默认多选自定义日历界面(TicketPainter)
ViewPager普通Viewdemo功能预览
日历拉伸

下载demo:

下载demo

使用方法

项目 build.gradle 文件, Gradle7.0以上为 settings.gradle , 添加 jitpack.io

dependencyResolutionManagement {
	repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
	repositories {
		mavenCentral()
		maven { url 'https://jitpack.io' }
	}
}

Gradle

implementation 'com.github.yannecer:NCalendar:6.0.0'

简单使用

月周切换日历
<com.necer.calendar.NCalendar
     android:id="@+id/monthCalendar"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
    

单个月日历,单个周日历

月日历
<com.necer.calendar.NCalendar
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     app:defaultCalendar="month"/>

周日历
<com.necer.calendar.NCalendar
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     app:defaultCalendar="week"/>
     
单独月日历和周日里,通过属性 defaultCalendar 控制,默认为月,日历高度通过 calendarHeight 控制
月日历默认 300dp 周日历高度为 calendarHeight/5 默认为60dp
通过修改 calendarHeight 来修改月日历和周日历的高度 


自定义属性

6.0版本 自定义属性  示例 app:defaultCalendar="week"

defaultCalendar -- 默认展示的日历 月->month 周->week  默认月
calendarHeight -- 日历中 月日历的高度 默认300dp 周日历高度为 calendarHeight/5
firstDayOfWeek -- 日历一周开始是周日或周一 周日->monday 周一->monday  默认周日
weekBarHeight -- 日历顶部星期的高度
stretchCalendarEnable -- 日历是否可拉伸 
showNumberBackground -- 是否显示数字背景 
todayCheckedBackground -- 今天选中的背景 shape drawable
todayCheckedSolarTextColor -- 今天选中时的公历字体颜色
......

更多自定义属性


日历Api

日历提供了各种可能用到的方法、回调,6.x版本增加了日历日期变化的行为参数,区分了各种引起日历变化的不同的操作

设置选中模式 
void setCheckMode(CheckModel checkModel);

跳转日期
void jumpDate(String formatDate);

上一页 上一周 上一月
void toLastPager();

下一页 下一周 下一月
void toNextPager();

回到今天
void toToday();

回到周状态
void toWeek();

......

更多日历Api

日历回调
1、单选回调

nCalendar.setOnCalendarChangedListener(new OnCalendarChangedListener() {
     @Override
     public void onCalendarChange(int year, int month, LocalDate localDate, DateChangeBehavior dateChangeBehavior) {
        
     }
});

2、多选回调
nCalendar.setOnCalendarMultipleChangedListener(new OnCalendarMultipleChangedListener() {
     @Override
     public void onCalendarChange(int year, int month, List<LocalDate> currPagerCheckedList, List<LocalDate> totalCheckedList, DateChangeBehavior dateChangeBehavior) {
         tv_result.setText(year + "年" + month + "月" + " 当前页面选中 " + currPagerCheckedList.size() + "个  总共选中" + totalCheckedList.size() + "个");
     }
});
        
 3、日历状态回调 周日历,月日历 状态变化
nCalendar.setOnCalendarStateChangedListener(new OnCalendarStateChangedListener() {
     @Override
     public void onCalendarStateChange(CalendarState calendarState) {
         
     }
});

日历回调


日历设置时间标记、替换文字等Api

日历设置时间标记、替换文字的Api,只对InnerPainter有效,如果是自定义日历UI,则这些方法需要自己实现,
可参考InnerPainter相关代码

日历设置时间标记、替换文字


自定义日历UI

如果自定义属性不能满足日历ui要求,可以使用自定义页面实现个性化需求,项目提供了两种自定义UI的方式,
1、实现CalendarPainter接口,通过Canvas绘制

自定义日历UI


交流群

技术交流QQ群:127278900 (请先仔细看文档,然后再进群发问,上方加粗字体有下载demo链接)


常见问题

1、Activity初始化onCreate中调用jumpDate闪退
   页面初始化时,日历还未完成初始化,可以使用 setInitializeDate 方法完成初始页面的日期选定,或者使用日历对象post方法设置jumpdate
           miui10Calendar.post(new Runnable() {
            @Override
            public void run() {
                miui10Calendar.jumpDate("2021-01-01");
            }
        });
        
2、日历UI问题,请使用自定义CalendarPainter,简单的做法是,复制库中InnerPainter,修改绘制的部分,然后给日历设置CalendarPainter
   nCalendar.setCalendarPainter(myCalendarPainter);

感谢:

农历和节气数据工具类来自 Hutool<br/>


更新日志

License

 Copyright 2018 necer

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.