RN ScrollView简单实现无限轮播

在这里插入图片描述
如上图所示, 需要实现一个简单的上翻轮播图, 展示最新的三条数据

错误思路

        onScroll={(event: any) => {
          if (!this.state.autoPlay) return;
          let y: any = event?.nativeEvent?.contentOffset.y
}}

以上方案通过y的滚动只 y%固定高度 来获取index ,这种方案的缺陷在于依赖y
y滚动结束实际返回中 会存在
30.12
60.21这种误差, 求余数的结果就非常不准确

简单方案 – 延时+递归+判断下标


  private setTimeAwait() {
    return new Promise((resolve) => {
      let time: any = setTimeout(() => {
        clearTimeout(time)
        time = null;
        resolve();
      }, this.delayTime)
    })
  }


  private async startScrollAnimated() {
    await this.setTimeAwait();

    if (this.fastNewsScrollIndex == 2) {
      this.fastNewsScrollIndex = 0
    } else {
      this.fastNewsScrollIndex += 1
    }
    this.doLoop();
  }

  private doLoop() {
    this?.loopScroll?.scrollTo({
      x: 0,
      y: this.fastNewsItemH * this.fastNewsScrollIndex,
      animated: this.fastNewsScrollIndex !== 0
    })
    this.startScrollAnimated();
  }

小瑕疵 - 最后回归index==0的时候, 无动画/或者动画重置效应 ,
这种解决也简单, 把数据源复制成3个一组 ,复制多组即可, 把视觉效果加长到用户感知边际以外…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值