calendar.png
最近項目中需要用到日歷控件赎线,1.需要給已經(jīng)記錄的日期添加圓環(huán)標(biāo)記2.給當(dāng)天日期添加背景3.給周末日期更改顏色4.日歷添加農(nóng)歷,需求如上圖所示:
GitHub的material-calendarview star較高,而且項目最貼近以上需求
MaterialCalendarView項目開源地址:
https://github.com/prolificinteractive/material-calendarview
集成清單
1.添加compile'com.prolificinteractive:material-calendarview:1.4.2'
2.添加日歷控件到布局中
功能展示
一.基礎(chǔ)的功能和事件這里不做描述赁酝,可以到官方的demo中細看梅鹦,下面貼出基礎(chǔ)設(shè)置的xml和代碼:
calendarView = (MaterialCalendarView) findViewById(R.id.calendar_calendarView);
year = TimeUtils.date2String(date, "yyyy");
month = TimeUtils.date2String(date, "MM");
//設(shè)置當(dāng)前時間
calendarView.setCurrentDate(date);
calendarView
.state()
.edit()
//設(shè)置一周的第一天是周日還是周一
.setFirstDayOfWeek(Calendar.SUNDAY)
//設(shè)置日期范圍
.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();
//設(shè)置周的文本
calendarView.setWeekDayLabels(new String[]{"日", "一", "二", "三", "四", "五", "六"});
//設(shè)置年月的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給特定日期添加特殊標(biāo)記,首先要實現(xiàn)DayViewDecorator 姐叁,里面的shouldDecorate方法用于判斷是否要對指定日期進行修飾桑谍,返回值boolean延柠,decorate方法用于設(shè)置樣式,里面運用了之前根本不了解的各種Span锣披。
1.給周末日期設(shè)置特殊字體顏色:
/**
* 作者:徐敏敏 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.給日歷當(dāng)天進行圓背景修飾:
/**
* 作者:徐敏敏 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.給日歷每一天下方添加農(nóng)歷字體:
/**
* 作者:徐敏敏 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.對特定日期增加圓環(huán)修飾:
/**
* 作者:徐敏敏 on 2016/12/20 0020 14:27
* 郵箱:15067596185@163.com
*/
public class EventDecorator implements DayViewDecorator {
private List<Date> dates;
public EventDecorator(List<Date> 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);//圓環(huán)寬度
//繪制圓環(huán)
paint.setColor(Color.parseColor("#00bcbe"));
paint.setStrokeWidth(ringWidth);
c.drawCircle((right - left) / 2, (bottom - top) / 2 + dip2px(4), dip2px(18), paint);
}
}