calendar.png

最近项目中需要用到日历控件,1.需要给已经记录的日期添加圆环标记2.给当天日期添加背景3.给周末日期更改颜色4.日历添加农历,需求如上图所示:

GitHub的material-calendarview star较高,而且项目最贴近以上需求

集成清单

1.添加compile'com.prolificinteractive:material-calendarview:1.4.2'

2.添加日历控件到布局中

功能展示

一.基础的功能和事件这里不做描述,可以到官方的demo中细看,下面贴出基础设置的xml和代码:

calendarView = (MaterialCalendarView) findViewById(R.id.calendar_calendarView);

year = TimeUtils.date2String(date, "yyyy");

month = TimeUtils.date2String(date, "MM");

//设置当前时间

calendarView.setCurrentDate(date);

calendarView

.state()

.edit()

//设置一周的第一天是周日还是周一

.setFirstDayOfWeek(Calendar.SUNDAY)

//设置日期范围

.setMinimumDate(CalendarDay.from(Integer.valueOf(year), Integer.parseInt(month) - 1, 1))

.setMaximumDate(CalendarDay.from(Integer.valueOf(year), Integer.parseInt(month) - 1, 31))

.setCalendarDisplayMode(CalendarMode.MONTHS)

.commit();

//设置周的文本

calendarView.setWeekDayLabels(new String[]{"日", "一", "二", "三", "四", "五", "六"});

//设置年月的title

calendarView.setTitleFormatter(new TitleFormatter() {

@Override

public CharSequence format(CalendarDay day) {

StringBuffer buffer = new StringBuffer();

int yearOne = day.getYear();

int monthOne = day.getMonth() + 1;

buffer.append(yearOne).append("年").append(monthOne).append("月");

return buffer;

}

});

//添加修饰

calendarView.addDecorators(new HighlightWeekendsDecorator(), new SameDayDecorator(), new LunarDecorator(year, month), new WorkdayDecorator());

//日期点击事件

calendarView.setOnDateChangedListener(this);

二.下面介绍MaterialCalendarView的强大自定义功能,addDecorators给特定日期添加特殊标记,首先要实现DayViewDecorator ,里面的shouldDecorate方法用于判断是否要对指定日期进行修饰,返回值boolean,decorate方法用于设置样式,里面运用了之前根本不了解的各种Span。

1.给周末日期设置特殊字体颜色:

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class HighlightWeekendsDecorator implements DayViewDecorator {

private final Calendar calendar = Calendar.getInstance();

@Override

public boolean shouldDecorate(CalendarDay day) {

day.copyTo(calendar);

int weekDay = calendar.get(Calendar.DAY_OF_WEEK);

return weekDay == Calendar.SATURDAY || weekDay == Calendar.SUNDAY;

}

@Override

public void decorate(DayViewFacade view) {

view.addSpan(new ForegroundColorSpan(Color.parseColor("#fd755c")));

}

}

2.给日历当天进行圆背景修饰:

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class SameDayDecorator implements DayViewDecorator {

@Override

public boolean shouldDecorate(CalendarDay day) {

Date date = new Date();

String dateStr = TimeUtils.date2String(date, "yyyy-MM-dd");

Date parse = TimeUtils.string2Date(dateStr, "yyyy-MM-dd");

if (day.getDate().equals(parse)) {

return true;

}

return false;

}

@Override

public void decorate(DayViewFacade view) {

view.addSpan(new CircleBackGroundSpan());

}

}

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class CircleBackGroundSpan implements LineBackgroundSpan {

@Override

public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) {

Paint paint = new Paint();

paint.setColor(Color.parseColor("#def0ef"));

c.drawCircle((right - left) / 2, (bottom - top) / 2 + dip2px(4), dip2px(18), paint);

}

}

3.给日历每一天下方添加农历字体:

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class LunarDecorator implements DayViewDecorator {

private String year;

private String month;

public LunarDecorator(String year, String month) {

this.year = year;

this.month = month;

}

@Override

public boolean shouldDecorate(CalendarDay day) {

return true;

}

@Override

public void decorate(DayViewFacade view) {

view.addSpan(new LunarSpan(year,month));

}

}

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class LunarSpan implements LineBackgroundSpan {

private String year;

private String month;

public LunarSpan(String year, String month) {

this.year = year;

this.month = month;

}

@Override

public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) {

StringBuffer buffer = new StringBuffer();

buffer.append(year).append("-").append(month).append("-").append(text);

Date parse = TimeUtils.string2Date(buffer.toString(), "yyyy-MM-dd");

Calendar calendar = Calendar.getInstance();

calendar.setTime(parse);

Lunar lunar = new Lunar(calendar);

String chinaDayString = lunar.getChinaDayString();

Paint paint = new Paint();

paint.setTextSize(dip2px(10));

paint.setColor(Color.parseColor("#cccccc"));

c.drawText(chinaDayString, (right - left) / 2 - dip2px(10), (bottom - top) / 2 + dip2px(17), paint);

}

}

4.对特定日期增加圆环修饰:

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class EventDecorator implements DayViewDecorator {

private List dates;

public EventDecorator(List dates) {

this.dates = dates;

}

@Override

public boolean shouldDecorate(CalendarDay day) {

return dates.contains(day.getDate());

}

@Override

public void decorate(DayViewFacade view) {

view.addSpan(new AnnulusSpan());

}

}

/**

* 作者:徐敏敏 on 2016/12/20 0020 14:27

* 邮箱:15067596185@163.com

*/

public class AnnulusSpan implements LineBackgroundSpan {

@Override

public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) {

Paint paint = new Paint();

paint.setAntiAlias(true); //消除锯齿

paint.setStyle(Paint.Style.STROKE);//绘制空心圆或 空心矩形

int ringWidth = dip2px(1);//圆环宽度

//绘制圆环

paint.setColor(Color.parseColor("#00bcbe"));

paint.setStrokeWidth(ringWidth);

c.drawCircle((right - left) / 2, (bottom - top) / 2 + dip2px(4), dip2px(18), paint);

}

}

android 仿旅游日历控件_Android日历控件MaterialCalendarView相关推荐

  1. android 桌面图标的点击放大效果,Android仿英语流利说取词放大控件的实现方法(附demo源码下载)...

    本文实例讲述了Android仿英语流利说取词放大控件的实现方法.分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜 ...

  2. Android仿QQ,网易邮箱客户端收件人控件

    效果图 实现思路 这个功能首先想到的是安卓原生控件AutoCompleteTextView和MultiAutoCompleteTextView 前者用的还是比较多的,比如字符联想,最近搜索记录等用的都 ...

  3. Android仿酷狗音乐自定义侧滑菜单控件简单实现

    随着Android的不断成熟,许多绚丽的效果也在不断的被大家开发出来,其中侧滑的效果用到的项目很多,用的好的更是给吸引了很多用户.国内像QQ和酷狗App的侧滑就很给力,所以查了一些资料,并结合View ...

  4. android仿微信下拉二楼_Android仿微信下拉列表实现

    本文要实现微信6.1中点击顶部菜单栏的"+"号按钮时,会弹出一个列表框.这里用的了Activity实现,其实最好的方法可以用ActionBar,不过这货好像只支持3.0以后的版本. ...

  5. android 仿微博评论编辑框_Android 仿微博的点赞功能的实现原理(持续点赞再取消)...

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

  6. android 仿旅游日历控件_Android实现仿魅族日历首页功能

    flyme5.0增加了很多优美的动画和交互,界面也变得相当精致.我手头现在就用着魅族MX5,感觉还不错哇!经常会打开它的日历看计划等,感觉它首页的滑动效果还不错,就试着实现一把. 效果分析 1 该首页 ...

  7. android 仿旅游日历控件_android 仿预订日历时间选择(如去哪儿,携程

    匿名用户 1级 2018-02-04 回答 看标题就知道了,一个日历选择,类似于去哪儿,携程,酒店预订功能 调用方法 package com.fly.caldroid;import android.a ...

  8. android 仿旅游日历控件_可能是第十好的Android 开源 日历 Calendar 仿小米

    简介 由于项目的需求,研究了众多日历软件.本软件是一款高仿小米的自定义日历>控件,周月视图平滑滚动,平滑切换,可以在xml文件中进行属性的配置定制,加入你自己的RecyclerView后,实现日 ...

  9. android 仿旅游日历控件_SuperCalendar 仿小米的Android 开源简单实用的日历表

    看到本篇文章的同学估计也是实验课或者项目需求中需要一个日历表,当我接到这个需求的时候,当时脑子压根连想都没想,这么通用的控件,GitHub上一搜一大堆不是嘛.可是等到真正做起来的时候,扎心了老铁,Gi ...

最新文章

  1. RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)
  2. 最新Python学习项目Top10!
  3. python程序员薪资-作为Python程序员,薪资一般是多少?
  4. 2021计算机应用基础统考,2021年度计算机应用基础统考练习题及答案.doc
  5. python练习笔记——利用信号signal处理僵尸进程
  6. css实现背景颜色透明,文字不透明
  7. java实现权重随机算法
  8. python图论库_Python 图论工具
  9. sentinel 时间窗口_Sentinel 实战-规则持久化
  10. java时间转化类,一小时前,刚刚一个月前
  11. MapXtreme2004的Web选择控件(三)
  12. Mac双网卡路由设置实现内外网同时访问
  13. 课设(房屋出租系统)
  14. java人民币金额大写_Java人民币金额数字转换成大写
  15. 各邮箱服务商的接收、发送邮件服务器地址、端口号
  16. 微信公众号基本配置时token获取失败原因及解决方法
  17. 通用商城系统V5.0
  18. 华为编程决赛后的感想
  19. DIY:制作一个语音识别的空调遥控器
  20. linux CentOS操作系统入门基本使用

热门文章

  1. iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?
  2. 轻时代来临 资深架构师分享手游五大设计要点
  3. 夏普大屏显示服务器,夏普展示4.1寸2K屏幕:2016年大规模应用
  4. CachedRowSet 接口
  5. 骁龙855 plus的存在意义有限,高通5G芯片较对手落后
  6. 星际争霸2细节技巧解析及三大种族计划
  7. 火狐浏览器韩国文字成方块显示 debian11
  8. Oracle数据库恢复表和表数据
  9. jQuery进度条插件JQMeter的简单使用
  10. [luogu9141] [THUPC 2023 初赛] 乱西星上的空战 -大模拟 - 计算几何