# CalendarView doc ### **CalendarView** Characteristics - Based on Canvas, Extreme speed - Hot plug UI customization - Support month view、 week view、year view、lunar calendar and so on - Support static or dynamic setting of week start - Support for static or dynamic setting of calendar item height - Support date interceptor and range - Support multi-touch, smooth scrolling calendar - Support like NestedScrolling - All UI depends on your drawing ### 1、Create a class extends the **MonthView** or **RangeMonthView**、**MultiMonthView**. ### If you need WeekView, also create a class extends the **WeekView** or **RangeWeekView**、**MultiWeekView**. - Implement these three methods :**onDrawSelected** **onDrawScheme** **onDrawText**, like this ```java /** * CustomMonthView with canvas */ public class CustomMonthView extends MonthView { /** * draw select calendar * * @param canvas canvas * @param calendar select calendar * @param x calendar item x start point * @param y calendar item y start point * @param hasScheme is calendar has scheme? * @return if return true will call onDrawScheme again */ @Override protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { canvas.drawRect(x , y , x + mItemWidth , y + mItemHeight, mSelectedPaint); return true; } /** * draw scheme if calendar has scheme * * @param canvas canvas * @param calendar calendar has scheme * @param x calendar item x start point * @param y calendar item y start point */ @Override protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint); } /** * draw text * * @param canvas canvas * @param calendar calendar * @param x calendar item x start point * @param y calendar item y start point * @param hasScheme is calendar has scheme? * @param isSelected is calendar selected? */ @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; int cx = x + mItemWidth / 2; canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, calendar.isCurrentDay() ? mCurDayTextPaint : calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); } } ``` - Add the class path in xml ```xml ``` - You can also use the hot plug feature, Quickly switch UI styles ```java mCalendarView.setWeekView(MeiZuWeekView.class); mCalendarView.setMonthView(MeiZuMonthView.class); ``` - Calendar has multiple view modes to choose depending on your needs ```xml MonthView、WeekView,and select_mode="default_mode" Same as mobile phone calendar,date interceptor is not supported ``` ```xml MonthView、WeekView,and select_mode="single_mode" Single mode, support date interceptor ``` ```xml RangeMonthView、RangeWeekView,need set select_mode="range_mode" support date intercept ``` ```xml MultiMonthView、MultiWeekView,need set select_mode="multi_mode" support date intercept ``` - If you need WeekView,Add parent layout **CalendarLayout** in **CalendarView** ```xml ``` - You can use the listener to monitor the WeekView and MonthView switch ```java public void setOnViewChangeListener(OnViewChangeListener listener); ``` - All off **CalendarLayout** attr,Smooth scrolling calendar. If used **CalendarLayout**,you need set **calendar_content_view_id** ```xml ``` - If you need a full style **CalendarView**, make app:calendar_match_parent="true", No need to use CalendarLayout - The **CalendarView** also provides a YearView if you need it - If you need to quick jump date ``` CalendarView.scrollToCalendar(); CalendarView.scrollToNext(); CalendarView.scrollToPre(); CalendarView.scrollToXXX(); ``` - Support static or dynamic setting of week start ``` app:week_start_with="mon、sun、sat" mCalendarView.setWeekStarWithSun(); mCalendarView.setWeekStarWithMon(); mCalendarView.setWeekStarWithSat(); ``` - Set calendar range ``` CalendarView.setRange(int minYear, int minYearMonth, int minYearDay, int maxYear, int maxYearMonth, int maxYearDay) ``` - Add OnCalendarInterceptListener to intercept calendar ```java mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() { @Override public boolean onCalendarIntercept(Calendar calendar) { return calendar.isWeekend(); } @Override public void onCalendarInterceptClick(Calendar calendar, boolean isClick) { //todo 点击拦截的日期回调 } }); ``` - You can get interception and range results in month and week view ```java boolean isInRange = isInRange(calendar); boolean isEnable = !onCalendarIntercept(calendar); ``` - The **CalendarView** provides scheme setting, **setSchemeDate(Map mSchemeDates)** - class **Calendar** ```java boolean isWeekend(); int getWeek(); String getSolarTerm(); String getGregorianFestival(); String getTraditionFestival(); boolean isLeapYear(); int getLeapMonth(); boolean isSameMonth(Calendar calendar); int compareTo(Calendar calendar); long getTimeInMillis(); int differ(Calendar calendar); ``` ### All of **CalendarView** attr ```xml                       ``` ### Better use with Demo when using.The calendar is very simple to customize