Android日历开发详解

[TOC]

对于一款轻度使用的日历,很多开源库都可以直接使用。看了不少开源的日历,很多一旦重度使用,就会出现性能问题,也有的代码重复率太高了,周历和月历的代码几乎80%都是重复的,一旦改动月历,周历也得跟着改。所以对于重度使用的日历,就需要自己写了。
先来看看我们需要的效果:

我们的目标是:

  1. 月视图和周视图可以切换
  2. 月视图左右滑动切换一个月,周视图左右滑动切换一周````````````````
  3. 月视图可以指定是否显示节假日和农历
  4. 月视图可以指定是否自动根据当月天数设置总行数
  5. 月视图可以指定起始日期,比如从每月5日开始算,那么显示的这个个月的日期就是当月5日到下个月4日。
  6. 月视图可以根据数据大小显示波浪图(三阶贝塞尔曲线)
  7. 手指往上滑可以切换为周视图,继续上滑可以隐藏日历,显示汇总数据

基本实现思路

布局

1.最外层:日历和日历下方的内容都放在一个Layout容器里面,在这个容器里处理各种滑动事件。

2.中间层:日历放在一个ViewPager中,可以左右滑动切换

3.最内层:根据经验,日历视图如果采用layout文件,那么将会inflate几十次layout,性能将会非常差,如果采用RecycleView,做成几十个格子,也是需要inflate几十次的,性能上也不行。所以,只能手动绘制,缺点是跟layout文件比起来,没有layout布局方便,需要手动绘制,优点是性能很好。

结构

结构上我们尽量增加代码复用,减少重复的代码。

  1. 在日历视图和ViewPager,通过类型判断当前是周视图还是月视图。
  2. 采用MVP模式,分离视图的显示和数据的加载

日历数据

使用List存储日历上的数据,遍历这个list,依次绘制出整个页面。每个日历格子需要的数据都存放在一个DaySumInfo对象中,根据这个对象的属性绘制相应的日期和其他数据。

我们需要一个日期数据中心,用来缓存日期数据,存放全局变量(比如当前页面选中的日期,这个是多个类共用的)。如果日历需要显示自定义的数据的话,还需要一个APP数据中心,用来缓存需要显示在日历中的APP数据。

我们统一采用Calendar对象作为日历的日期标识。

Android日历开发:日期工具类TimeUtils

Android日历开发:日历显示需要准备哪些数据

Android日历开发:使用Canvas绘制按周显示和按月显示的日历

Android日历开发:按月显示和按周显示滑动切换

如果您觉得这篇文章不错,可以打赏支持下哦,谢谢