Android 日期选择器 滚轮样式的选择器
github: DatePickerView
PickerView inside。
Usage
Gradle
Project level build.gradle1
2
3
4
5allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
App level build.gradle1
2
3dependencies {
implementation 'com.github.limxing:DatePickerView:1.0.1'
}
XML
1 | <top.leefeng.datepicker.DatePickerView |
Attribute
1 | app:dpvBackgroundColor="#ffffff" 选中(中间条目)的背景色,默认透明 |
Code
kotlin1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//监听回调闭包
datePickerView.listener = {
//[year,month,day]
}
//起止日期及当前定位日期
datePickerView.setDate("1990-01-01","2021-01-09","1999-09-09")
//需要进一步加工
datePickerView.drawListener = object : PickerView.DrawListener {
/**
* width recyclerView 宽
* height recyclerView 高
* cellHeight 选中View 高
*/
override fun drawBelow(canvas: Canvas?, width: Int, height: Int, cellHeight: Int) {
//按需要画背景
}
override fun drawOver(canvas: Canvas?, width: Int, height: Int, cellHeight: Int) {
//按需要画前景。(有同学可能需要上下覆盖渐变效果,可在此实现,避免在此创建对象)
}
}
SimplePickerView1
2
3
4
5
6 val list = listOf("北京市","天津市","上海市","河北省","山东省","河南省","辽宁省","江苏省","安徽省")
simplePicker.setData(list,3){
//position
}
//进一步加工
simplePickerView.drawListener //... 同上
java1
//什么?都2021年了你还在使用JAVA。Kotlin与JAVA 兼容,请自行Google。
实现原理
Android发展的这么多年,很多Android开发者包括我面对做一个与IOS滚轮选择器UI时,各种搜索,
不难发现很多前辈为此付出了不少努力。有反编译别人apk的,有继承View自定义的,简单点的使用ListView
或Recyclerview在其上画一个渐变蒙层。结果就是要么有BUG的,要么与UI不符,还有的滑动时错位的。
我也是一个比较懒的人。不想全部自定义View,毕竟列表这种事情,系统SDK控件Recyclerview已经做的不是很好了吗!
因此,我就在RecyclerView上下手找到突破口。
首先我们分析一下:
草稿:
1、UI效果:
- 角度:滚轮效果上来看就是一个半圆,从正面看,选中的条目x轴方向角度是0,其上方的条目x轴角度的方向应该是0 至 90°,其下方的角度应该是0 至 -90°
- 大小:选中的条目大小与设置的一致,从中间至上下逐渐变小
- 位置:当Item进行角度和大小的变换后,越远离选中条目的条目之间的距离越大,因此,我们要对item设置y轴的位移,
2、如何在哪配置代码
分析:查看RecyclerView的源码,所有的Item的位置是由LinearLayoutManager管理的,
但是界面的绘制还是在Recyclerview中,我们是否能够在绘制Item前对itemView进行配置呢?
当然可以,我们重写RecyclerView的dispatchDraw方法,这样绘制子View的工作就由我们来处理,
源码可见,绘制子View使用drawChild方法。因此我们继承RecyclerView命名PickerView并且重写dispatchDraw方法。
3、核心代码实现
1 | override fun dispatchDraw(canvas: Canvas?) { |
4、DatePickerView的实现
DatePickerView继承自ViewGroup,是一个常规的自定义View,有兴趣可以参考 源码 。
本项目还提供了一个通用选择器:SimplePickerView,使用如上所述。
当然你还可以使用PickerView进行其他选择器的开发,例如时间选择器、省市联动选择器。
最后,如遇到bug请及时issue。希望能够对你有帮助。
License
DatePickerView and PickerView is available under the MIT license.