写点什么

满足你各种姿势的最美 Android 开源日历,android 音频

用户头像
Android架构
关注
发布于: 44 分钟前

/**


  • 绘制选中的日子

  • @param canvas canvas

  • @param calendar 日历日历 calendar

  • @param x 日历 Card x 起点坐标

  • @param y 日历 Card y 起点坐标

  • @param hasScheme hasScheme 非标记的日期

  • @return 返回 true 则绘制 onDrawScheme,因为这里背景色不是是互斥的,所以返回 true*/@Overrideprotected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint);return true;}


/**


  • 绘制标记的事件日子

  • @param canvas canvas

  • @param calendar 日历 calendar

  • @param x 日历 Card x 起点坐标

  • @param y 日历 Card y 起点坐标*/@Overrideprotected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint);canvas.drawText(calendar.getScheme(),x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,y + mPadding + mSchemeBaseLine, mTextPaint);}


/**


  • 绘制文本

  • @param canvas canvas

  • @param calendar 日历 calendar

  • @param x 日历 Card x 起点坐标

  • @param y 日历 Card y 起点坐标

  • @param hasScheme 是否是标记的日期

  • @param isSelected 是否选中*/@Overrideprotected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {int cx = x + mItemWidth / 2;int top = y - mItemHeight / 6;


boolean isInRange = isInRange(calendar);


if (isSelected) {canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,mSelectTextPaint);canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);} else if (hasScheme) {canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint);


canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint);} else {canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,calendar.isCurrentDay() ? mCurDayTextPaint :calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint);canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint :calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);}}}


  • 当你实现好之后,直接在 xml 界面上添加特性,可以即时预览效果:


app:month_view="com.haibin.calendarviewproject.MeiZuCalendarCardView"app:week_view="com.haibin.calendarviewproject.MeiZuWeekView"


  • 但这种静态模式可能无法满足你的需求,你可能需要动态变换定制的视图界面,于是你可以使用热插拔特性,即插即用,不爽就换:


mCalendarView.setWeekView(MeizuWeekView.class);


mCalendarView.setMonthView(MeizuMonthView.class);


  • CalendarView 也提供了高效便利的年视图,可以快速切换年份、月份,十分便利



  • 但年视图也不一定就适合产品经理的胃口,产品经理希望像小米日历一样,弹出 DatePickerView,通过它来跳转日期,于是你可以使用以下的 API 来让日历与其它控件联动


CalendarView.scrollToCalendar();


CalendarView.scrollToNext();


CalendarView.scrollToPre();


CalendarView.scrollToXXX();


  • 你也许需要像魅族日历一样,可以静态、动态更换周起始


app:week_start_with="mon、sun、sat"


CalendarView.setWeekStarWithSun();


CalendarView.setWeekStarWithMon();


CalendarView.setWeekStarWithSat();


  • 假如你是做酒店、旅游等应用场景的 APP 的,那么需要可选范围的日历,你可以这样继承,和普通视图实现完全一样


public class CustomRangeMonthView extends RangeMonthView{


}


public class CustomRangeWeekView extends RangeWeekView{


}


  • 然后你需要设置选择模式为范围模式:select_mode="range_mode"

  • 酒店式日历场景当然是不能从昨天开始订房的,也不能无限期订房,所以你需要静态或动态设置日历范围、精确到具体某一天!!!


<attr name="min_year" format="integer" /><attr name="max_year" format="integer" /><attr name="min_year_month" format="integer" /><attr name="max_year_month" format="integer" /><attr name="min_year_day" format="integer" /><attr name="max_year_day" format="integer" />


CalendarView.setRange(int minYear, int minYearMonth, int minYearDay,int maxYear, int maxYearMonth, int maxYearDay)


  • 当然还有更


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


特殊的日子也是不能选择的,例如:某月某号起这 N 天时间内因为超强台风来袭,酒店需停止营业 N 天,这段期间不可订房,这时日期拦截器就排上用场了


//设置日期拦截事件 mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() {@Overridepublic boolean onCalendarIntercept(Calendar calendar) {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
满足你各种姿势的最美Android开源日历,android音频