{"id":18372385,"url":"https://github.com/sy007/calendarview","last_synced_at":"2025-07-01T04:39:34.125Z","repository":{"id":57734970,"uuid":"166658884","full_name":"sy007/CalendarView","owner":"sy007","description":"一款强大的Android日历控件","archived":false,"fork":false,"pushed_at":"2023-03-10T16:10:50.000Z","size":3306,"stargazers_count":89,"open_issues_count":0,"forks_count":17,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-06T19:38:14.797Z","etag":null,"topics":["android","calendar","canvas","kotlin"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sy007.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-20T12:31:02.000Z","updated_at":"2025-03-07T07:29:29.000Z","dependencies_parsed_at":"2025-04-06T19:32:16.697Z","dependency_job_id":"5f7aae2b-4d05-444e-b777-ed5b978ba105","html_url":"https://github.com/sy007/CalendarView","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/sy007/CalendarView","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sy007%2FCalendarView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sy007%2FCalendarView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sy007%2FCalendarView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sy007%2FCalendarView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sy007","download_url":"https://codeload.github.com/sy007/CalendarView/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sy007%2FCalendarView/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262899512,"owners_count":23381625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","calendar","canvas","kotlin"],"created_at":"2024-11-06T00:05:28.874Z","updated_at":"2025-07-01T04:39:34.068Z","avatar_url":"https://github.com/sy007.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 自定义日历控件\nRecycleView实现,每个itemView cavas绘制，这意味着日历上每个月份很容易的实现自定义绘制。\n\n### 1. 支持以下功能\n\n- [x] 日历支持自定义范围展示\n- [x] 月份视图支持自定义行高度,间距,间距颜色设置\n- [x] 月份视图支持自定义绘制\n- [x] 月份视图头，脚布局。头布局支持悬停\n- [x] 月份视图支持固定行和动态行高度展示 (固定行:6行，动态行:根据当前展示的月份计算)\n- [x] 月份视图支持从一周的某个星期开始\n- [x] 月份视图支持纵向，横向滑动(ViewPager模式)\n- [x] 日期支持单选，范围选择，多选\n- [x] 日期支持点击事件拦截\n- [x] 日期支持自定义绘制\n### 2. Example\n\n![image](http://m.qpic.cn/psc?/V11vVsP84HfNn2/bqQfVz5yrrGYSXMvKr.cqfZqDZTE14QcuJmw9w*x3uW9sPUlZ5R7gG4UkZq4hYu95iD96W3.z26xo0p9OlPMGCAQiIbNPdfscbFf50GGr20!/b\u0026bo=cBfGCnAXxgoBByA!\u0026rf=viewer_4)\n#### 扫码体验\n\n![](https://www.pgyer.com/app/qrcode/q5pv)\n\n### 3. 使用\n\n#### 3.1. 集成\n\n```groovy\nimplementation 'io.github.sy007:calendar-view:1.2.1'\n```\n\n#### 3.2. 在XML中定义CalendarView \n\n```xml\n\u003c!--周视图--\u003e\n\u003ccom.sy007.calendar.widget.WeekView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"10dp\"\n    android:layout_marginBottom=\"10dp\"\n    sy:wv_content=\"@array/week_sunday_to_saturday\"\n    sy:wv_text_color=\"#333333\"\n    sy:wv_text_size=\"13sp\" /\u003e\n\n\u003c!--日历--\u003e\n\u003ccom.sy007.calendar.widget.CalendarView\n    android:id=\"@+id/cv_single_calendar_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" /\u003e\n```\n\n#### 3.3. 代码中初始化\n\n##### 3.3.1. 设置月份布局\n\n```kotlin\nvar selectedDay:CalendarDay?=null\nval cvSingleCalendarView:CalendarView\n...\n//设置月份视图\ncvSingleCalendarView.monthViewBinder = object : MonthViewBinder\u003cSingleMonthViewSimple2\u003e {\n    override fun create(parent: ViewGroup): SingleMonthViewSimple2 {\n        return SingleMonthViewSimple2(parent.context)\n    }\n    override fun onBind(view: SingleMonthViewSimple2, calendarDay: CalendarDay) {\n        view.apply {\n            //设置选中的日期\n            selected = selectedDay\n            onSelectedListener = object : OnSelectedListener {\n                override fun onSelected(selected: CalendarDay) {\n                    selectedDay = selected\n                    //点击日期后滑动到指定日期\n                    cvSingleCalendarView.smoothScrollToMonth(selected)\n                    tvCurrentSelectedDate.text = selected.formatDate(\"yyyy-MM-dd\")\n                }\n            }\n        }\n    }\n}\n```\n\n##### 3.3.2. 构建日历展示范围和样式数据模型\n\n```kotlin\nval startCalendar = Calendar.getInstance().apply {\n    set(Calendar.DAY_OF_MONTH, getActualMinimum(Calendar.DAY_OF_MONTH))\n}\nval endCalendar = Calendar.getInstance().apply {\n    add(Calendar.MONTH, 10)\n    set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))\n}\n//初始化日历展示范围和样式\nval calendarConfig = CalendarConfig(startCalendar, endCalendar).apply {\n  //横向滑动\n  orientation = RecyclerView.HORIZONTAL\n  //ViewPager滚动模式\n  scrollMode = ScrollMode.PAGE\n  //固定6行高度\n  heightMode = HeightMode.FIXED\n  //月份视图上展示额外日期\n  isDisplayExtraDay = true\n}\n```\n\n##### 3.3.3. 将数据模型设置给日历视图\n\n```kotlin\ncvSingleCalendarView.setUp(calendarConfig)\n```\n\n`SingleMonthViewSimple2`是自定义月份视图，它继承SingleMonthView；你可以在`SingleMonthViewSimple2`中自定义绘制和处理日期是否可以被选中逻辑。\n\n框架内部还内置了`RangeMonthView`(范围选择),`MultipleMonthView`（多选）月份视图基类，根据需求选择一个继承即可。\n\nSingleMonthViewSimple2简略代码如下\n\n```kotlin\nclass SingleMonthViewSimple2 @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : SingleMonthView(context, attrs, defStyleAttr) {\n\n    /**\n     * 拦截日期选中事件，如果拦截则不会回调日期选中事件\n     * 你可以在此方法中拦截不想让用户点击的日期\n     * @return true 表示拦截，false 表示不拦截\n     */\n    override fun onInterceptSelect(calendarDay: CalendarDay): Boolean {\n        return super.onInterceptSelect(calendarDay)\n    }\n\n    /**\n     * 月份日期绘制前调用，你可以在绘制前做一些事\n     */\n    override fun onDrawMonthBefore(canvas: Canvas, calendarDay: CalendarDay) {\n        super.onDrawMonthBefore(canvas, calendarDay)\n\n    }\n\n    /**\n     * 月份日期绘制后调用，你可以在绘制后做一些事\n     */\n    override fun onDrawMonthAfter(canvas: Canvas, calendarDay: CalendarDay) {\n        super.onDrawMonthAfter(canvas, calendarDay)\n    }\n\n    /**\n     * 日期绘制时调用，你可以在这里绘制月份上的日期\n     *\n     * [calendarDay] 待绘制的日期模型\n     * [rect]       日期绘制的范围\n     * [isSelected] 该日期是否是选中状态\n     */\n    override fun onDrawDay(canvas: Canvas, calendarDay: CalendarDay, rect: Rect, isSelected: Boolean) {\n\n    }\n}\n```\n\n### 4. 自定义属性\n\nWeekView(周视图)\n\n|属性 | 类型 | 描述 |\n| :------------------------- | --------- | ---------------------------------- |\n| wv_weekend_text_color | color | 周末字体颜色 |\n| wv_text_color | color | 默认字体颜色 |\n| wv_text_size | color | 字体大小 |\n| wv_content | reference | 星期展示的文案 |\n| wv_weekend_index | reference | 周末索引(如果要设置周末字体颜色,需要告诉框架周末在wv_content中的索引位置) |\n\nXXMonthView(月份视图)\n\n| 属性 | 类型 | 描述 |\n| :------------------------- | --------- | ---------------------------------- |\n| dividerHeight | dimension | 月份视图行间距高度 |\n| dividerColor | color | 月份视图行间距颜色 |\n| rowHeight | dimension | 月份视图行高度 |\n\n### 5. [Docs](https://sy007.github.io/calendar-view-docs/html/)\n\n### 6. 更新日志\n\n#### v1.2.1\n\n修复`ScrollMode.PAGE`模式下,高度无法自适应问题\n\n#### v1.2.0\n\n支持脚布局\n\n#### v1.0.1\n\n修复获取`BaseMonthView#rowHeight`自定义属性类型不正确问题\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsy007%2Fcalendarview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsy007%2Fcalendarview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsy007%2Fcalendarview/lists"}