一、文章背景

用过两个日历控件的库,有用viewpager实现的,也有用canvas实现的。在实际使用过程中,发现使用canvas实现的calendarView切换下一月和下一年这种操作时切换更流畅。

我这里主要记录上一年和下一年的使用,其他功能大家可以参考第三方库的使用Github

二、日历控件的使用

2.1、实现MonthView

package com.wyy.usecalendarviewimport android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import androidx.core.content.ContextCompat
import com.haibin.calendarview.Calendar
import com.haibin.calendarview.MonthViewclass ScheduleMonthView(context: Context) : MonthView(context) {/*** 背景圆点*/private val mPointPaint = Paint()/*** 今天的背景色*/private val mCurrentDayPaint = Paint()/*** 圆点半径*/private var mPointRadius = 3finit {mCurrentDayPaint.isAntiAlias = truemCurrentDayPaint.style = Paint.Style.FILLmCurrentDayPaint.color = ContextCompat.getColor(context, R.color.purple_700)mPointPaint.isAntiAlias = truemPointPaint.style = Paint.Style.FILLmPointPaint.textAlign = Paint.Align.CENTERmPointPaint.color = ContextCompat.getColor(context, R.color.purple_200)}/*** 绘制选中的日子(这个绘制会覆盖标记点的显示)** @param canvas    canvas* @param calendar  日历日历calendar* @param x         日历Card x起点坐标* @param y         日历Card y起点坐标* @param hasScheme hasScheme 非标记的日期* @return 返回true 则绘制onDrawScheme,因为这里背景色不是是互斥的,所以返回true*/override fun onDrawSelected(canvas: Canvas, calendar: Calendar, x: Int, y: Int, hasScheme: Boolean): Boolean {if (!calendar.isCurrentDay) {mSelectedPaint.style = Paint.Style.STROKEmSelectedPaint.strokeWidth = 2fval rectF = RectF(x.toFloat(), y.toFloat(), (x + mItemWidth).toFloat(), (y + mItemHeight).toFloat())canvas.drawRoundRect(rectF, 16f, 16f, mSelectedPaint)}return true}/*** 绘制标记的事件日子(只绘制非当天的标记点,避免重复绘制)** @param canvas   canvas* @param calendar 日历calendar* @param x        日历Card x起点坐标* @param y        日历Card y起点坐标*/override fun onDrawScheme(canvas: Canvas, calendar: Calendar, x: Int, y: Int) {if (!calendar.isCurrentDay) {canvas.drawCircle((x + mItemWidth / 2).toFloat(), (y + mItemHeight - 13).toFloat(), mPointRadius, mPointPaint)}}/*** 绘制文本(如果今天有标记点,这里还需要绘制当天的标记点)** @param canvas     canvas* @param calendar   日历calendar* @param x          日历Card x起点坐标* @param y          日历Card y起点坐标* @param hasScheme  是否是标记的日期* @param isSelected 是否选中*/override fun onDrawText(canvas: Canvas?, calendar: Calendar?, x: Int, y: Int, hasScheme: Boolean, isSelected: Boolean) {val cx = x + mItemWidth / 2calendar?.let {canvas?.let { cit ->if (it.isCurrentDay) {val rectF = RectF(x.toFloat(), y.toFloat(), (x + mItemWidth).toFloat(), (y + mItemHeight).toFloat())cit.drawRoundRect(rectF, 16f, 16f, mCurrentDayPaint)if (hasScheme) {//  绘制当天的标记点cit.drawCircle((x + mItemWidth / 2).toFloat(),(y + mItemHeight - 13).toFloat(),mPointRadius,mPointPaint)}}val drawPaint = if (isSelected && !it.isCurrentDay) {mSelectTextPaint} else if (hasScheme) {if (it.isCurrentMonth) mSchemeTextPaint else mOtherMonthTextPaint} else {if (it.isCurrentDay) mCurDayTextPaint else if (it.isCurrentMonth) mCurMonthTextPaint else mOtherMonthTextPaint}cit.drawText(it.day.toString(), cx.toFloat(), mTextBaseLine + y, drawPaint)}}}
}

2.2、布局代码使用示例:

<com.haibin.calendarview.CalendarViewandroid:id="@+id/cv_calendar"android:layout_width="0dp"android:layout_height="wrap_content"app:calendar_height="40dp"app:current_day_text_color="@color/black"app:current_month_text_color="@color/black"app:day_text_size="14sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/toolbar"app:layout_constraintRight_toRightOf="parent"app:month_view="com.wyy.usecalendarview.ScheduleMonthView"app:other_month_text_color="@color/teal_700"app:selected_text_color="@color/black"app:selected_theme_color="@color/purple_700"app:week_background="@android:color/transparent"app:week_bar_height="40dp"app:week_text_color="@color/black"app:week_text_size="14sp"app:month_view_show_mode="mode_all"app:select_mode="single_mode" />

2.3、注册日历的事件监听

2.3.1、监听月份切换

mDataBinding.cvCalendar.setOnMonthChangeListener(this)

2.3.2、监听选择事件

mDataBinding.cvCalendar.setOnCalendarSelectListener(this)

2.4、实现日历的监听事件

2.4.1、月份切换的实现

    override fun onMonthChange(year: Int, month: Int) {supportActionBar?.title = getString(R.string.title, year, month)}

2.4.2、选择事件的实现

    /*** 没用到*/override fun onCalendarOutOfRange(calendar: Calendar?) {}/*** 用户选择的监听*/override fun onCalendarSelect(calendar: Calendar?, isClick: Boolean) {Log.d("wyy","Selector year is ${calendar?.year},month is ${calendar?.month},day is ${calendar?.day} and isClick is $isClick")}

2.5、操作日历控件

2.5.1、上一年

            mDataBinding.cvCalendar.monthViewPager.apply {currentItem -= 12}

2.5.2、下一年

            mDataBinding.cvCalendar.monthViewPager.apply {currentItem += 12}

2.6、demo

Github

记一次Android第三方日历控件CalendarView的使用相关推荐

  1. android自定义选年控件,Android精美日历控件CalendarView自定义使用完全解析

    项目github地址 此框架采用组合的方式,各个模块互相独立,可自由采用各种提供的控件组合,完全自定义自己需要的UI,周视图和月视图可通过简单自定义任意自由绘制,不怕美工提需求!!!下面教程将介绍如何 ...

  2. Android考勤日历控件

    工作这么久,第一次在CSDN上写技术博客,望大家多多支持: 本篇博文给大家分享一个考勤日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期.可以通过不同的颜色表示每天的考勤状态: ...

  3. Android自定义日历控件,自带农历节假日,已经开源,即取即用~

    关注本人的更多博客:http://www.cnblogs.com/liushilin/ 该自定义日历控件已经开源:github地址 可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多, ...

  4. 自定义日历控android,Android 一个日历控件的实现小记

    先看几张动态的效果图吧! 这里主要记录一下在编写日历控件过程中一些主要的点: 一.主要功能 1.支持农历.节气.常用节假日 2.日期范围设置,默认支持的最大日期范围[1900.1~2049.12] 3 ...

  5. 日历控件CalendarView

    API 11中新加了CalendarView控件,即日历控件.但是如果需要在3.0以下系统中支持,就需要自定义了. https://github.com/square/android-times-sq ...

  6. android美柚日历控件,仿美柚大姨妈日历

    [实例简介] 仿美柚月经显示在日历上,包括月经记录,月经预测,月经分析等功能 [实例截图] [核心代码] 6306a7a2-fa5a-4fa8-b376-199fbe2b9d21 └── 仿美柚大姨妈 ...

  7. 日历控件CalendarView的使用

    项目需要用到CalendarView故而整理CanlendarView的相关API Gradle implementation 'com.haibin:calendarview:3.5.5' Cale ...

  8. Android开发之如何实现日历控件

    我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView. 先简单介绍 ...

  9. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

最新文章

  1. 扫描服务器端口信息工具,服务器端口扫描工具
  2. 学习Windows2008——设计活动目录
  3. [Django]模型学习记录篇--基础
  4. IT运维服务管理问题总结 #F#
  5. IPv6 解说 ,与IPv4的同异
  6. NestedScrolling机制
  7. AcWing 204. 表达整数的奇怪方式 / Strange Way To Express Integers
  8. .NET防止重复提交
  9. ubuntu下Chrome浏览器字体问题 字体发虚解决办法
  10. 数据结构---最小生成树
  11. 基于PHP的在线聊天室(网页版)
  12. cad.net objectarx 后台打开dwg
  13. 2022最新阿里云域名注册和续费优惠口令及使用方法
  14. 傻瓜式PHP模版,poscms傻瓜式开发模块
  15. 新元宇宙奇科幻小说原创作品每周连载《地球人奇游天球记》第九回女神伴飞
  16. android手机存储空间猛增,为什么安卓手机运行内存和储存空间增长速度这么快,什么原因呢?...
  17. 计算机管理恢复分区,windows10系统隐藏恢复分区Recovery Image的方法
  18. 【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)
  19. mysql 围栏_一个电子围栏需求的脚本记录
  20. 实习纪实——1.31记

热门文章

  1. GCC编译器中三个重要的函数
  2. 深度学习的显卡对比评测:2080ti vs 3090 vs A100
  3. 人无自信当废人无自信而不立
  4. 面向对象开发期末复习概述(二)
  5. 实践任务1:利用 HBuilderX制作产品展示模块+实践任务2:利用 HBuilderX制作公司网站首页+实践任务3: 利用 HBuilderX制作公司网站首页实现固定侧边菜单
  6. unity卡死或崩溃日志查询
  7. 中国科学院大学毕业典礼致辞全文
  8. python中in是什么意思中文_python中的in是什么意思
  9. 电话交换机tdmx2000dx硬件配置说明
  10. 51单片机c语言16进制数转换10进制数,51单片机C语言里 怎样将16进制 直接化成 10进制...