当前位置:   article > 正文

Android GitHub开源库CalendarView的使用_android calendarview

android calendarview

学习并记录一下,使用GitHub上面的日历控件开源库CalendarView,地址:https://github.com/huanghaibin-dev/CalendarView

实现效果如下:

添加Gradle依赖

  1. dependencies {
  2. ......
  3. //日历控件
  4. implementation 'com.haibin:calendarview:3.6.2'
  5. ......
  6. }

实现MultiMonthView,可多选

MultiMonthView.java继承BaseMonthView.java查看该类,里面的不同日历子view的画笔都在里面有定义,可以根据需要进行设置,要什么view就使用什么画笔进行绘制。

比如我这里的四个画笔分别对应的含义:

mCurDayLunarTextPaint 当前日期文本颜色画笔
mSchemeTextPaint  标记的文本画笔
mOtherMonthTextPaint 其它月份日期颜色
mCurDayTextPaint  当前日期文本颜色画笔
  1. public class CustomMonthView extends MultiMonthView {
  2. private int mRadius;
  3. public CustomMonthView(Context context) {
  4. super(context);
  5. }
  6. @Override
  7. protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) {
  8. //绘制选中的背景
  9. int cx = x + mItemWidth / 2;
  10. int cy = y + mItemHeight / 3 + 10;
  11. mSelectedPaint.setAntiAlias(true);
  12. canvas.drawCircle(cx, cy, mRadius, mSelectedPaint);
  13. return true;
  14. }
  15. @Override
  16. protected void onPreviewHook() {
  17. mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2;
  18. }
  19. @Override
  20. protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) {
  21. }
  22. /**
  23. * 绘制文本
  24. *
  25. * @param canvas canvas
  26. * @param calendar 日历calendar
  27. * @param x 日历Card x起点坐标
  28. * @param y 日历Card y起点坐标
  29. * @param hasScheme 是否是标记的日期
  30. * @param isSelected 是否选中
  31. */
  32. @Override
  33. protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
  34. int cx = x + mItemWidth / 2;
  35. int top = y - mItemHeight / 8;
  36. if (hasScheme) {
  37. canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
  38. isSelected ? mSelectTextPaint
  39. : calendar.isCurrentDay() ? mCurDayLunarTextPaint
  40. : calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
  41. } else {
  42. canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
  43. isSelected ? mSelectTextPaint
  44. : calendar.isCurrentDay() ? mCurDayLunarTextPaint
  45. : calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
  46. }
  47. if (!isSelected && calendar.isCurrentDay())
  48. canvas.drawText("今", cx, mTextBaseLine + top, mCurDayTextPaint);
  49. }
  50. }

布局代码使用示例

  1. <com.haibin.calendarview.CalendarView
  2. android:id="@+id/calendarView"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:paddingLeft="10dp"
  6. android:paddingRight="10dp"
  7. app:calendar_height="40dp"
  8. app:current_day_text_color="#2079FF"
  9. app:layout_constraintStart_toStartOf="@+id/tv_years"
  10. app:layout_constraintTop_toBottomOf="@+id/tv_years"
  11. app:lunar_text_size="0dp"
  12. app:month_view="com.gwm.careco.mobile.car.views.CustomMonthView"
  13. app:month_view_scrollable="true"
  14. app:select_mode="single_mode"
  15. app:selected_text_color="#FFFFFF"
  16. app:selected_theme_color="#2079FF" />

实现点击(<>)左右箭头实现左右翻页功能

可分别调用scrollToPre()、scrollToNext()方法,日历布局设置都在这个类CalendarView.java,里面会有获取当天、获取本月、设置月视图是否可滚动等基本属性和回调接口,都能在该类找到,里面也都是中文注释比较方便翻看。

  1. //滚动到上一个月
  2. mCalendarView.scrollToPre();
  3. //滚动到下一个月
  4. mCalendarView.scrollToNext();
实现左右滑动切换月份实时显示当前年月

只需继承CalendarView.OnMonthChangeListener的

  1. @Override
  2. public void onMonthChange(int year, int month) {
  3. if (mYears != null) mYears.setText(year + "年" + month + "月");
  4. }


注意:记得添加calendarView.setOnMonthChangeListener(this)

如果需要监听日历选中的日期有哪些,可以继承 CalendarView.OnCalendarMultiSelectListener

注意:记得添加CalendarView.setOnCalendarMultiSelectListener(this)

可以在如下方法内获取到选中的日期

  1. @Override
  2. public void onCalendarMultiSelect(com.haibin.calendarview.Calendar calendar, int curSize, int maxSize) {
  3. //获取选中的日期
  4. int day = calendar.getDay();
  5. int month = calendar.getMonth();
  6. }

设置今天之后的日期不选中,继承CalendarView.OnCalendarInterceptListener(select_mode要设置成支持拦截)

onCalendarIntercept返回true就表示不可选中,反之亦然。
  1. @Override
  2. public boolean onCalendarIntercept(com.haibin.calendarview.Calendar calendar) {
  3. //获取日历上选中的日、月、年
  4. int day = calendar.getDay();
  5. int month = calendar.getMonth();
  6. int year = calendar.getYear();
  7. //获取当前日期的日、月、年
  8. int day1 = mCalendarView.getCurDay();
  9. int month1 = mCalendarView.getCurMonth();
  10. int year1 = mCalendarView.getCurYear();
  11. mIsClickable = year < year1 || (year == year1 && (month < month1 || (month == month1 && day < day1)));
  12. return mIsClickable;
  13. }
  14. @Override
  15. public void onCalendarInterceptClick(com.haibin.calendarview.Calendar calendar, boolean isClick) {
  16. ToastManager.getInstance().showToast((isClick ? "不能选择小于当前日期" : "无效日期"));
  17. }

完成。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/930129
推荐阅读
相关标签
  

闽ICP备14008679号