Jetpack Compose 开源实践 - 70行实现与iOS完全一致的滑动越界效果,封装成随处可用的Modifier!

595 阅读1分钟

老规矩,先看效果:

overscrollIOS.gif 那么怎么实现呢?小编也很想知道呢,快来和小编一起看看吧!

注:本文已垂直方向的overscroll为例,水平方向同原理

已上传至github,如果觉得nice,别忘了顺手star,不然我可就没动力了嗷: github.com/Cormor/Comp…

创建一个自定义Modifier

fun Modifier.overScrollVertical(): Modifier = composed { this }

接入几个核心Modifier

上段代码的this即是将要返回的Modifier,我们为了滑动越界,需要:

  1. 对Modifier修饰的元素进行偏移
  2. 使得该Modifier支持嵌套滚动的事件处理和进一步分发
  3. 防止滚动越界后盖住同级元素

所以有如下几个Modifier需要使用到

this
    .clipToBounds() // 对应第3点,Modifier的顺序敏感性使得它必须先于offset调用
                    // 以实现【显示位置限制】
    .offset {}      // 对应第1点
    .nestedScroll() // 对应第2点

关于offset

有以下情况需要注意:

  1. 会被动画到指定位置
  2. 需要能跟手变化
  3. 运行时是float值,最后需要的是int值,最后再转换!提前转换会导致精度损失

关于nestedScroll

有以下情况需要注意:

  1. 创建时需要一个connection,一个dispatcher
  2. nestedConnection需要手动实现并重写其一些function,一般其4个function都需要重写

所以有代码如下:

——直接去github看吧,反正开源了(突然犯懒)。

这里的逻辑解析,有人需要看我再更新,嘿嘿嘿嘿……

源代码

点击访问OverScroll主页 点击访问OverScroll.kt文件源码