满足你各种姿势的最美 Android 开源日历,android 音频
/**
绘制选中的日子
@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)
当然还有更
特殊的日子也是不能选择的,例如:某月某号起这 N 天时间内因为超强台风来袭,酒店需停止营业 N 天,这段期间不可订房,这时日期拦截器就排上用场了
//设置日期拦截事件 mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() {@Overridepublic boolean onCalendarIntercept(Calendar calendar) {
评论