目录
简要介绍
CalendarView是Android上一个优雅、高度自定义、性能高效的日历控件,完美支持周视图,支持标记、自定义颜色、农历等,任意控制月视图显示、任意日期拦截条件、自定义周起始等。
CalendarView 的特性
- 基于Canvas绘制,极速性能
- 热插拔思想,任意定制周视图、月视图,即插即用
- 支持单选、多选、范围选择、国内手机日历默认自动选择等选择模式
- 支持静态、动态设置周起始,一行代码搞定
- 支持静态、动态设置日历项高度、日历填充模式
- 支持设置任意日期范围、任意拦截日期
- 支持多点触控、手指平滑切换过渡,拒绝界面抖动
- 类NestedScrolling特性,嵌套滚动
- 既然这么多支持,那一定支持英语、繁体、简体,任意定制实现
简要实现代码与效果演示
下面展示CalendarView最简单的使用方法。
<CalendarView
android:id="@+id/calendarView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
实现效果:
ClendarView常见属性及方法
| 属性 | 说明 |
|---|---|
| android:dateTextAppearance="" | 设置该日历视图的日期文字的样式 |
| android:firstDayOfWeek="" | 设置每周第一天,允许设置周一到周日任意一天作为每周的第一天 |
| android:maxDate="" | 设置该日历组件支持的最大日期,以mm/dd/yyyy格式设置指定最大日期 |
| android:minDate="" | 设置该日历组件支持的最小日期,以mm/dd/yyyy格式设置指定最小日期 |
| android:background="" | 设置整体背景颜色/图片 |
| android:weekDayTextAppearance | 工作日的文本出现在日历标题缩写 |
| 方法 | 说明 |
|---|---|
| boolean isWeekend() | 判断是不是周末,可以用不同的画笔绘制周末的样式 |
| int getWeek() | 获取星期 |
| String getSolarTerm() | 获取24节气,可以用不同颜色标记不同节日 |
| String getGregorianFestival() | 获取公历节日,自由判断,把节日换上喜欢的颜色 |
| String getTraditionFestival() | 获取传统节日 |
| boolean isLeapYear() | 是否是闰年 |
| int getLeapMonth() | 获取闰月 |
| boolean isSameMonth(Calendar calendar) | 是否相同月 |
| int compareTo(Calendar calendar) | 比较日期大小 |
| long getTimeInMillis() | 获取时间戳 |
| int differ(Calendar calendar) | 日期运算,相差多少天 |
简单实现日期选择
添加监听事件
在主活动中添加监听事件CalendarView.OnDateChangeListener ,在用户选择日期时触发相关效果(例:选择日期背景颜色改变)
获得具体日期
在主活动中,为其添加监听事件后
可以通过 day, month, dayOfMonth 来获得用户选择的日期的具体信息:
具体实现代码
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CalendarView calendarview = (CalendarView) findViewById(R.id.calendarview);
calendarview.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
Toast.makeText(MainActivity.this,"您选择的时间是:"+ year + "年" + month + "月" + dayOfMonth + "日",Toast.LENGTH_SHORT).show();
}
});
}
}
实现效果

ClendarView attrs
CalendarView 的全部xml特性如下:
<declare-styleable name="CalendarView">
<attr name="calendar_padding" format="dimension" /><!--日历内部左右padding-->
<attr name="month_view" format="color" /> <!--自定义类日历月视图路径-->
<attr name="week_view" format="string" /> <!--自定义类周视图路径-->
<attr name="week_bar_height" format="dimension" /> <!--星期栏的高度-->
<attr name="week_bar_view" format="color" /> <!--自定义类周栏路径,通过自定义则 week_text_color week_background xml设置无效,当仍可java api设置-->
<attr name="week_line_margin" format="dimension" /><!--线条margin-->
<attr name="week_line_background" format="color" /><!--线条颜色-->
<attr name="week_background" format="color" /> <!--星期栏的背景-->
<attr name="week_text_color" format="color" /> <!--星期栏文本颜色-->
<attr name="week_text_size" format="dimension" /><!--星期栏文本大小-->
<attr name="current_day_text_color" format="color" /> <!--今天的文本颜色-->
<attr name="current_day_lunar_text_color" format="color" /><!--今天的农历文本颜色-->
<attr name="calendar_height" format="string" /> <!--日历每项的高度,56dp-->
<attr name="day_text_size" format="string" /> <!--天数文本大小-->
<attr name="lunar_text_size" format="string" /> <!--农历文本大小-->
<attr name="scheme_text" format="string" /> <!--标记文本-->
<attr name="scheme_text_color" format="color" /> <!--标记文本颜色-->
<attr name="scheme_month_text_color" format="color" /> <!--标记天数文本颜色-->
<attr name="scheme_lunar_text_color" format="color" /> <!--标记农历文本颜色-->
<attr name="scheme_theme_color" format="color" /> <!--标记的颜色-->
<attr name="selected_theme_color" format="color" /> <!--选中颜色-->
<attr name="selected_text_color" format="color" /> <!--选中文本颜色-->
<attr name="selected_lunar_text_color" format="color" /> <!--选中农历文本颜色-->
<attr name="current_month_text_color" format="color" /> <!--当前月份的字体颜色-->
<attr name="other_month_text_color" format="color" /> <!--其它月份的字体颜色-->
<attr name="current_month_lunar_text_color" format="color" /> <!--当前月份农历节假日颜色-->
<attr name="other_month_lunar_text_color" format="color" /> <!--其它月份农历节假日颜色-->
<!-- 年视图相关 -->
<attr name="year_view_month_text_size" format="dimension" /> <!-- 年视图月份字体大小 -->
<attr name="year_view_day_text_size" format="dimension" /> <!-- 年视图月份日期字体大小 -->
<attr name="year_view_month_text_color" format="color" /> <!-- 年视图月份字体颜色 -->
<attr name="year_view_day_text_color" format="color" /> <!-- 年视图日期字体颜色 -->
<attr name="year_view_scheme_color" format="color" /> <!-- 年视图标记颜色 -->
<attr name="min_year" format="integer" /> <!--最小年份1900-->
<attr name="max_year" format="integer" /> <!--最大年份2099-->
<attr name="min_year_month" format="integer" /> <!--最小年份对应月份-->
<attr name="max_year_month" format="integer" /> <!--最大年份对应月份-->
<!--月视图是否可滚动-->
<attr name="month_view_scrollable" format="boolean" />
<!--周视图是否可滚动-->
<attr name="week_view_scrollable" format="boolean" />
<!--年视图是否可滚动-->
<attr name="year_view_scrollable" format="boolean" />
<!--配置你喜欢的月视图显示模式模式-->
<attr name="month_view_show_mode">
<enum name="mode_all" value="0" /> <!--全部显示-->
<enum name="mode_only_current" value="1" /> <!--仅显示当前月份-->
<enum name="mode_fix" value="2" /> <!--自适应显示,不会多出一行,但是会自动填充-->
</attr>
<!-- 自定义周起始 -->
<attr name="week_start_with">
<enum name="sun" value="1" />
<enum name="mon" value="2" />
<enum name="sat" value="7" />
</attr>
<!-- 自定义选择模式 -->
<attr name="select_mode">
<enum name="default_mode" value="0" />
<enum name="single_mode" value="1" />
<enum name="range_mode" value="2" />
</attr>
<!-- 当 select_mode=range_mode -->
<attr name="min_select_range" format="integer" />
<attr name="max_select_range" format="integer" />
</declare-styleable>
使用ClendarView实现的不同风格日历欣赏
ClendarView使用的插拔式设计既可以在编译时指定年月日视图,如:app:month_view=“xxx.xxx.MonthView.class”,也可在运行时动态更换年月日视图,如:CalendarView.setMonthViewClass(MonthView.Class),从而达到UI即插即用的效果,相当于框架不提供UI实现,让UI都由客户端实现,不至于日历UI都千篇一律,只需遵守插拔式接口即可随意定制,自由化程度非常高,因此可以按照自己的想法定制各种风格的日历。
例如:

图片来源.

图片来源.
总结
ClendarView是安卓一个高自由度且强大的日历控件,能够自由的帮助我们实现各种我想想要的精美日历样式,这里只是简单介绍了一些ClendarView最基本的用法,希望对你们有所帮助。
参考文献:疯狂Android讲义
参考资料:https://gitee.com/huanghaibin_dev/CalendarView
作者:阮龙康
原文链接.
版权声明:本文为greyzz3原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。