老规矩,先看效果:
那么怎么实现呢?小编也很想知道呢,快来和小编一起看看吧!
注:本文已垂直方向的overscroll为例,水平方向同原理
已上传至github,如果觉得nice,别忘了顺手star,不然我可就没动力了嗷: github.com/Cormor/Comp…
创建一个自定义Modifier
fun Modifier.overScrollVertical(): Modifier = composed { this }
接入几个核心Modifier
上段代码的this即是将要返回的Modifier,我们为了滑动越界,需要:
- 对Modifier修饰的元素进行偏移
- 使得该Modifier支持嵌套滚动的事件处理和进一步分发
- 防止滚动越界后盖住同级元素
所以有如下几个Modifier需要使用到
this
.clipToBounds() // 对应第3点,Modifier的顺序敏感性使得它必须先于offset调用
// 以实现【显示位置限制】
.offset {} // 对应第1点
.nestedScroll() // 对应第2点
关于offset
有以下情况需要注意:
- 会被动画到指定位置
- 需要能跟手变化
- 运行时是float值,最后需要的是int值,最后再转换!提前转换会导致精度损失
关于nestedScroll
有以下情况需要注意:
- 创建时需要一个connection,一个dispatcher
- nestedConnection需要手动实现并重写其一些function,一般其4个function都需要重写
所以有代码如下:
——直接去github看吧,反正开源了(突然犯懒)。
这里的逻辑解析,有人需要看我再更新,嘿嘿嘿嘿……