使用:
//使用
val customDecorator = PrimeDayCustomDecorator(ScreenUtil.sp2px(contenxt, 7))
//设置自定义装饰者
MaterialCalendarView().addDecorator(customDecorator);
//更新
customDecorator.setFullDays(fullDays);
calendarView.invalidateDecorators();
样式
PrimeDayCustomDecorator
/**
* com.prolificinteractive.materialcalendarview.MaterialCalendarView
* 自定义 DayViewDecorator
* 作用是加载自定义 String Span
*/
public class PrimeDayCustomDecorator implements DayViewDecorator {
private FullViewSpan fullViewSpan;
HashMap<Long, Boolean> mFullDays = new HashMap<>();
/**
* FullViewSpan 为自定义span
* @param textSize MaterialCalendarView 设置的字体大小
*/
public PrimeDayCustomDecorator(int textSize) {
this.fullViewSpan = new FullViewSpan(textSize);
}
/**
* 设置满足条件的日期
* @param fullDays
*/
public void setFullDays(@NonNull HashMap<Long, Boolean> fullDays){
mFullDays = fullDays;
}
/**
* 是否使用自定义span视图样式
* @param day 当前天
* @return
*/
@Override
public boolean shouldDecorate(CalendarDay day) {
return mFullDays.get(day.getDate().getTime()) != null;
}
@Override
public void decorate(DayViewFacade view) {
//加载自定义span
view.addSpan(fullViewSpan);
view.setDaysDisabled(true);
}
}
FullViewSpan
/**
* 自定义span,满足要求的日期,加上后缀文案,且后缀字体大小可自定义
*/
public class FullViewSpan implements LineBackgroundSpan {
private final int suffixTextColor;
private final String suffixTextStr;
private int suffixTextSize;
public FullViewSpan(int textSize) {
suffixTextSize = textSize;
suffixTextColor = Color.parseColor("#AAAAAA");
suffixTextStr = " (后缀)";
}
@Override
public void drawBackground(Canvas canvas, Paint paint,
int left, int right, int top, int baseline, int bottom,
CharSequence charSequence,
int start, int end, int lineNum) {
canvas.save();
//获取公共设置的字体大小
float oldTextSize = paint.getTextSize();
//原始文案
String day = charSequence.toString();
//计算原始文案视图宽
float oldTextWidth = paint.measureText(day);
//设置后缀的字体大小
paint.setTextSize(suffixTextSize);
//计算后缀文案的字体视图宽
float suffixTextWidth = paint.measureText(suffixTextStr);
//设置满足条件的字体颜色
paint.setColor(suffixTextColor);
//画笔还原字体大小
paint.setTextSize(oldTextSize);
//绘制原始文案,x坐标为:(天视图View的宽-原始文案宽-后缀文案宽)/2 ;使文字居中绘制
canvas.drawText(day, (right - oldTextWidth - suffixTextWidth) / 2,
baseline, paint);
//画笔设置后缀的字体大小
paint.setTextSize(suffixTextSize);
//绘制后缀文案,x坐标为:(天视图View的宽-原始文案宽-后缀文案宽)/2 + 原始文案宽; 使后缀文字跟随在原始文案后面
canvas.drawText(suffixTextStr, (right - oldTextWidth - suffixTextWidth) / 2 + oldTextWidth,
baseline, paint);
//画笔还原
paint.setColor(Color.TRANSPARENT);
paint.setTextSize(oldTextSize);
canvas.restore();
}
}