Android日歷控件MaterialCalendarView

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);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贞间,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雹仿,更是在濱河造成了極大的恐慌增热,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盅粪,死亡現(xiàn)場離奇詭異钓葫,居然都是意外死亡,警方通過查閱死者的電腦和手機票顾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門础浮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆调,“玉大人,你說我怎么就攤上這事豆同》” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵影锈,是天一觀的道長芹务。 經(jīng)常有香客問我,道長鸭廷,這世上最難降的妖魔是什么枣抱? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辆床,結(jié)果婚禮上佳晶,老公的妹妹穿的比我還像新娘。我一直安慰自己讼载,他們只是感情好轿秧,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咨堤,像睡著了一般菇篡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上一喘,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天驱还,我揣著相機與錄音,去河邊找鬼津滞。 笑死铝侵,一個胖子當(dāng)著我的面吹牛灼伤,可吹牛的內(nèi)容都是我干的触徐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼狐赡,長吁一口氣:“原來是場噩夢啊……” “哼撞鹉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颖侄,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸟雏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后览祖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孝鹊,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年展蒂,在試婚紗的時候發(fā)現(xiàn)自己被綠了又活。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苔咪。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柳骄,靈堂內(nèi)的尸體忽然破棺而出团赏,到底是詐尸還是另有隱情,我是刑警寧澤耐薯,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布舔清,位于F島的核電站,受9級特大地震影響曲初,放射性物質(zhì)發(fā)生泄漏体谒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一臼婆、第九天 我趴在偏房一處隱蔽的房頂上張望家凯。 院中可真熱鬧,春花似錦胸遇、人聲如沸村缸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽被去。三九已至,卻和暖如春奖唯,著一層夾襖步出監(jiān)牢的瞬間惨缆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工丰捷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坯墨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓病往,卻偏偏與公主長得像捣染,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子停巷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容