先看效果:
功能:
- 月份切换
- 日期范围选择
具体实现:代码量比较少,具体功能看注释
CalendarComponent.kt
/**
* <pre>
* author : lifei
* e-mail : lifeidroid@gmail.com
* time : 2022/11/15
* desc : 可以选择日期范围的日历控件
* version: 1.0
* </pre>
*/
@Composable
fun CalendarComponent(
startDate: String = DateUtils.getTodayDate(),
endDate: String = DateUtils.getTodayDate(),
dateSelectedBack: (String, String) -> Unit
) {
//当前年份
var cYear by remember {
mutableStateOf(LocalDateTime.now().year)
}
//当前月
var cMonth by remember {
mutableStateOf(LocalDateTime.now().month)
}
/**
* 选中的日期
*/
var selectedDate = remember {
mutableStateListOf(startDate, endDate)
}
MonthComponent(
year = cYear,
month = cMonth,
selectDay = selectedDate,
dayClick = {
if (selectedDate.size == 2) {
selectedDate.clear()
}
selectedDate.add(it)
if (selectedDate.size == 2) {
if (DateUtils.compareTime(selectedDate[0], selectedDate[1])) {
dateSelectedBack.invoke(selectedDate[0], selectedDate[1])
} else {
dateSelectedBack.invoke(selectedDate[1], selectedDate[0])
}
}
}, preMonth = {
if (cMonth.value == 1) {
cYear = cYear.minus(1)
cMonth = Month.DECEMBER
} else {
cMonth = cMonth.minus(1)
}
}, nexMonth = {
if (cMonth.value == 12) {
cYear = cYear.plus(1)
cMonth = Month.JANUARY
} else {
cMonth = cMonth.plus(1)
}
}
)
}
/**
* 月份组件
* @param year Int 当前年份
* @param month Month 当前月份
* @param selectDay List<String> 已选中的日期
* @param preMonth Function0<Unit> 上一个月点击事件
* @param nexMonth Function0<Unit> 下一个月点击事件
* @param dayClick Function1<String, Unit>
*/
@Composable
fun MonthComponent(