本文会通过和目前github上最受欢迎的PickerView库做详细的对比,通过对比你可以清晰的感受它的好用和强大。基本可以解决链家现有app的所有pickerview相关需求。
Screenshot
TimePicker 示意图 :
MixedTimePicker 示意图 :
OptionPicker 示意图:
介 绍
APK
Demo App 下载连接
README
PickerView
README
Picker
通过组装 PickerView 实现常用的 Picker 选择器。下面列举提供的 3 中常用的 Picker。
支持扩展自定义 Picker。
Ø TimePicker:时间选择器,包含日期
Ø MixedTimePicker::聚合的时间选择器
Ø OptionPicker:联动选择器
BasePicker
Picker 基类:封装了 TopBar,PickerView 容器,create and add PickerView 方法,Picker 弹窗等方法。 三种 Picker 都继承自 BasePicker,你也可以继承它扩展自己的 Picker。
设 置 场 景
API
对比 github 上最受欢迎的同类库 Android-PickerView 本库将 TopBar 等通用相关逻辑封装在基类中,并提供代码中创建 PickerView 方法,不需要再依赖 xml。用户自定义 Picker 时,继承 BasePicker,只需要处理自己的逻辑即可,简单便捷。 而对 Android-PickerView 来说,实现自定义 Picker,依然需要处理 TopBar 等逻辑。造成大量重复代码。
TopBar
TopBar:TopBar 通过抽象接口 ITopBar 来管理,实现 Picker 与 TopBar 的解耦。
提供默认实现 DefaultTopBar。可实现接口定制自己的 TopBar。
DefaultTopBar API
Interceptor
拦截器:用于在 pickerview 创建时拦截,设置 pickerview 的属性。
Picker 内部并不提供对 PickerView 的设置方法,而是通过 Interceptor 实现。这种设计用来实现 Picker 和 PickerView 的属性设置完美解耦。
这一点对比 Android-PickerView, 每个 Picker 都需要声明对 PickerView 的设置方法,与 PickerView 严重耦合。需要开发者 copy 大量重复代码,且无法区分每一个 PickerView 设置不同的属性。
TimePicker
常用的时间选择器,支持 年、月、日、时、分
Ø 时间类型type的设计:自由组合、随心所欲(当然应该是有意义的)
对比 Android-PickerView TimePickerView:
Ø 完美支持时间区间设置以及选中联动
Ø 支持Format,如显示今年,明年
API
Formatter
TimePicker Formatter:用于根据 type 和 num 格式化时间文案
内部提供默认的 Formatter 实现 DefaultFormatter。用户可以设置自定义 Formatter 或继承 DefaultFormatter 进行扩展。
TimePicker 初始化,如果未设置时间区间,会使用默认区间。三种 Picker 都采用 Builder 模式初始化。且用户自定义的 Picker 也应该采用这种模式进行初始化。
使 用 案 例
Simple Example
MixedTimePicker
常用的聚合时间选择器。日期(年、月、日)聚合,时间(小时、分钟)聚合。
Ø 混合模式:github上的TimePicker库基本都不提供该种类型的Picker
Ø 支持自定义日期格式,时间格式
Ø 支持设置时间间隔 * 支持设置区间以及选中联动
Ø 支持设置纯日期,纯时间模式,采用type同TimePicker
API
Formatter
MixedTimePicker Formatter:用于自定义日期和时间格式。内部提供默认的 Formatter 实现。
MixedTimePicker 的 Formatter 完美体现了 Formatter 设计的精妙之处。用户可以根据回调中的 type 和 date 自定义日期和时间格式。比如显示今天,或 xx 月 xx 日 星期 x。
使 用 案 例
Simple Example
不同于 TimePicker, MixedTimePicker 由于支持纯时间模式(日期取选中时间的日期),不提供默认区间。如果模式中包含日期模式,则会强制要求设置时间区间。
OptionPicker
Ø 支持设置层级
Ø 构造数据源及其简单,只需要实现OptionDataSet接口
Ø 支持通过对应选中的values设置选中项。内部处理选中项逻辑,避免用户 记录下标且麻烦的遍历处理
对比 Android-PickerView 的 OptionsPickerView
Android-PickerView 中的 OptionsPickerView 代码。由于不知道层级,所以每个方法都提供 3 个用来对应(最多)3 级选择。
本库中的 OptionPicker
如上面对比表格中所列举的,无论是层级,构造数据源和设置数据源,还是设置选中的选项,本库的 API 都十分简单,方便。
API
需要注意的是:本库中的 OptionPicker 只用于联动的,不支持多级别且不联动。 基本没有这种需求,如果大家有这种需求,我会在后续迭代中支持。
延 伸 拓 展
Others
奇葩设计:部分 default 属性声明为 static 而非 final
全局设置 default 属性
奇葩也好,亮点也罢。作为一个 UI 控件,不同的 app,不同的 UI,不同的产品自然会有不同的样式。 考虑到在一个 app 中我们会用到很多 Picker,而我们又需要定制自己的 UI 的样式,如果通过动态方法设置样式就太麻烦了。 故做此设计。你可以通过配置这些 static 变量来快速定制一个满足自己 app 样式需求的 Picker。 当然你也可以通过封装方法来处理 PickerView,Picker,装饰器等样式,但这样一样十分麻烦。我相信你自己都会烦。
静态默认值
所有的这些静态属性值都以 sDefault 开头
• BasePickerView
• PickerView
• BasePicker
• DefaultCenterDecoration
建议初始化这些属性值放到 Application 中完成,避免 app 发生 crash 而导致失效。
Simple Example
Change Log
v1.0.0(2018-03-03)
release v1.0.0
Gradle
Thanks
• ScrollPickerView
• Android-PickerView
作者介绍:
付朝阳,新房移动端,15 年 6 月加入链家。先后负责新房用户端、经纪人端 Android app 的开发。
本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。
原文链接:
https://mp.weixin.qq.com/s/fSrWF4PFZkvky7rkeCf46w
评论