前言
在 Jetpack Compose 中实现滚动选择器(Scrollable Picker),通常可以使用 LazyColumn 或 HorizontalPager 等组件。
但如果你想要类似传统 Android 的 NumberPicker 那种居中高亮、可滚动选择的效果,推荐使用 Modifier.graphicsLayer + LazyListState 来实现自定义的垂直/水平滚动选择器。
组件封装
1 | import androidx.compose.foundation.background |
使用
1 | val years = (1900..2100).map { it.toString() } |
注意点
滚动结束监听
最好的方式是滚动结束的时候在触发选中事件,不要一直滚动一直触发,效果不好。
这就需要监听什么时候滚动结束了。
1 |
|
选中项居中
要想选中项居中,这个有一个简单的实现方法
1 | contentPadding = PaddingValues(vertical = itemHeight * ((showItemNum - 1) / 2)), |
设置容器的内部padding就行,假如显示5项,我们内部padding设置为2项的高度,那么相当于显示一项,这一项就是居中的。
注意
显示的项目至少是3,并且要是单数。
找到中心项
找到中心项,也就是找到某一项的中心离 viewport 中心最近的项。
item.offset 是 item 顶部相对于 viewport 顶部的偏移(可为负)。
注意
viewport 是要排除contentPadding的,也就是说contentPadding内的内容在页面上能看到,但是不算
viewport内。
所以viewport的中心就是显示的那一项的中心。
1 | val centerY = itemHeightPx / 2f |
高度测量
1 | val density = LocalDensity.current |