日历农历选法java_GitHub - jinhuizxc/NCalendar: 一款安卓日历,仿miui,钉钉,华为的日历,万年历、365、周日历,月日历,月视图、周视图滑动切换,农历,节气,And...

NCalendar是一款安卓日历库,支持MIUI9、MIUI10、EMUI风格的月周滑动切换,具备农历、节气、法定节假日等功能。可自定义颜色、布局,并提供多种回调接口,适配不同日历交互需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓日历 NCalendar

特点:

3种常见日历交互方式,MIUI系统日历:miui9、miui10、华为emui,miui9和钉钉日历类似,华为emui和365日历类似

月周滑动切换

支持设置默认视图,默认周日历或者月日历

支持周状态固定,下拉刷新等

支持设置一周开始的是周一还是周日

可设置日期区间,默认区间从1901-01-01到2099-12-31

支持单独月日历和单独周日历默认不选中

支持农历,节气、法定节假日等

支持添加指示点及设置指示点位置

支持各种颜色、距离、位置等属性

支持日历和列表之间添加view

支持替换农历、颜色等

支持自定义日历页面

效果图

miui9

miui10

emui

miui9_gif.gif

miui10_gif.gif

emui_gif.gif

周固定,下拉刷新

日历和子view添加其他view

自定义日历界面

week_hold.gif

add_view1.png

custom1.png

下载demo:

使用方法

Gradle

implementation 'com.necer.ncalendar:ncalendar:3.4.5'

月周切换

miui9 和 钉钉日历

android:id="@+id/miui9Calendar"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:id="@+id/recyclerView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

Miui10Calendar EmuiCalendar 用法类似

单个月日历,单个周日历

月日历

android:layout_width="match_parent"

app:todaySolarTextColor="#ff00ff"

app:selectCircleColor="#00c3aa"

app:hollowCircleColor="#00c3aa"

android:layout_height="300dp" />

周日历

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

主要Api

1、监听

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)

2、跳转日期

参数为 yyyy-MM-dd 格式的日期

ncalendar.jumpDate("2017-12-31");

3、回到今天

ncalendar.toToday();

4、日历切换,月-->周  周-->月

ncalendar.toWeek();

ncalendar.toMonth();

5、上一月、下一月、上一周、下一周

ncalendar.toNextPager();

ncalendar.toLastPager();

6、默认视图

app:defaultCalendar="week" 默认周视图

app:defaultCalendar="month" 默认月视图

7、周状态固定

app:isWeekHold="true" 周视图固定,下拉刷新

8、设置日期区间

app:startDate="2018-01-01" 开始日期

app:endDate="2018-12-31" 结束日期

setDateInterval(startFormatDate, endFormatDate)

9、设置初始化日期

setInitializeDate(formatDate)

10、设置CalendarPainter

setCalendarPainter(painter)

11、刷新页面

自定义的标签等,如果在初始化时设置不需要调用此方法,如果在初始化之后设置,需要调用此方法

notifyAllView()

12、添加指示圆点

此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现

List 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);

13、设置法定节假日

此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现

List holidayList = Arrays.asList("2018-10-01", "2018-11-19", "2018-11-20");

List holidayList = Arrays.asList("2019-10-01", "2019-11-19", "2019-11-20");

InnerPainter innerPainter = (InnerPainter) miui10Calendar.getCalendarPainter();

innerPainter.setHolidayAndWorkdayList(holidayList,workdayList);

14、替换农历文字及颜色

此功能为默认 CalendarPainter 类 InnerPainter 的功能,如果设置了自定义 CalendarPainter ,没有此方法,需要自己实现

InnerPainter innerPainter = (InnerPainter) miui10Calendar.getCalendarPainter();

Map strMap = new HashMap<>();

strMap.put("2019-01-25", "测试");

strMap.put("2019-01-23", "测试1");

strMap.put("2019-01-24", "测试2");

innerPainter.setReplaceLunarStrMap(strMap);

Map 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);

CalendarPainter

日历绘制接口,绘制的所有内容通过这个接口完成,实现这个类可实现自定义的日历界面,

参数中的 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

修复当月跳转今天不回调

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值