https://github.com/huanghaibin-dev/CalendarViewjava
/** * 定制高仿魅族日历界面,按你的想象力绘制出各类各样的界面 * Created by huanghaibin on 2017/11/15. */
public class MeiZuMonthView extends MonthView {
/** * 绘制选中的日子 * * @param canvas canvas * @param calendar 日历日历calendar * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 * @param hasScheme hasScheme 非标记的日期 * @return 返回true 则绘制onDrawScheme,由于这里背景色不是是互斥的,因此返回true */
@Override
protected 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起点坐标 */
@Override
protected 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 是否选中 */
@Override
protected 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);
}
}
}
复制代码
<attr name="month_view" format="string" /><!--自定义月视图路径-->
<attr name="week_view" format="string" /> <!--自定义周视图路径-->
app:month_view="com.haibin.calendarviewproject.MeiZuCalendarCardView"
app:week_view="com.haibin.calendarviewproject.MeiZuWeekView"
复制代码
mCalendarView.setWeekView(MeizuWeekView.class);
mCalendarView.setMonthView(MeizuMonthView.class);
复制代码
CalendarView.scrollToCalendar();
CalendarView.scrollToNext();
CalendarView.scrollToPre();
CalendarView.scrollToXXX();
复制代码
app:week_start_with="mon、sun、sat"
CalendarView.setWeekStarWithSun();
CalendarView.setWeekStarWithMon();
CalendarView.setWeekStarWithSat();
复制代码
public class CustomRangeMonthView extends RangeMonthView{
}
public class CustomRangeWeekView extends RangeWeekView{
}
复制代码
而后你须要设置选择模式为范围模式:select_mode="range_mode"git
酒店式日历场景固然是不能从昨天开始订房的,也不能无限期订房,因此你须要静态或动态设置日历范围、精确到具体某一天!!!github
<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)
复制代码
//设置日期拦截事件
mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() {
@Override
public boolean onCalendarIntercept(Calendar calendar) {
//这里写拦截条件,返回true表明拦截
return calendar.isWeekend();
}
@Override
public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
//todo 点击拦截的日期回调
}
});
复制代码
boolean isInRange = isInRange(calendar);//日期是否在范围内,超出范围的能够置灰
boolean isEnable = !onCalendarIntercept(calendar);//日期是否可用,没有被拦截,被拦截的能够置灰
复制代码
也许你只须要像原生日历那样就够了,但原生日历那奇怪且十分不友好的style,受到theme的影响,各类头疼,使用此控件,你只须要简简单单定制月视图就够了,CalendarView 能很是简单就高仿各类日历UIcanvas
CalendarView 提供了 setSchemeDate(Map<String, Calendar> mSchemeDates) 这个十分高效的API用来动态标记事务,即时你的数据量达到数千、数万、数十万,都不会对UI渲染形成影响bash
日历类 Calendar 提供了许多十分有用的APIapp
boolean isWeekend();//判断是否是周末,能够用不一样的画笔绘制周末的样式
int getWeek();//获取星期
String getSolarTerm();//获取24节气,能够用不一样颜色标记不一样节日
String getGregorianFestival();//获取公历节日,自由判断,把节日换上喜欢的颜色
String getTraditionFestival();//获取传统节日
boolean isLeapYear();//是不是闰年
int getLeapMonth();//获取闰月
boolean isSameMonth(Calendar calendar);//是否相同月
int compareTo(Calendar calendar);//毕竟日期大小 -1 0 1
long getTimeInMillis();//获取时间戳
int differ(Calendar calendar);//日期运算,相差多少天
复制代码