# 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