Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【React-Native】react-native-swiper 判断滑动方向和滑动次数 #4

Open
famousczm opened this issue Dec 27, 2018 · 0 comments

Comments

@famousczm
Copy link
Owner

famousczm commented Dec 27, 2018

问题描述

使用组件 react-native-swiper 时总会遇到的一个问题就是如何判断用户是向左滑还是向右滑,将文档看来看去都没有找到相关的属性或方法,只能自己去计算了。另一个问题是,在 swiper 是 loop 的情况下,快速滑动之后,如何知道滑动了多少个页面

解决方法

在 swiper中监听三个事件 onScrollBeginDrag、onScroll 和 onMomentumScrollEnd。onScrollBeginDrag 每滑一次都会触发,在这里记录 e.nativeEvent.contentOffset.x 的值(垂直方向滑动的话记录 e.nativeEvent.contentOffset.y)。在 onScroll 中再记录一次 e.nativeEvent.contentOffset.x 的值(onScroll会在onScrollBeginDrag之后触发)。最后在 onMomentumScrollEnd 中判断 onScroll 和 onScrollBeginDrag 中记录的偏移量就能判断滑动的方向了(onMomentumScrollEnd 只会在滑动动画完成后才会触发)。

另一个滑动多少页面的问题,由于 onScrollBeginDrag 每滑动一次都会触发,所以可以在 onScrollBeginDrag 里记录,但是有一种情况是你拖动了但又放回去,这时页面并没有切换,而 onScrollBeginDrag 却触发了,可以对比上一次的偏移量来过滤,页面没有切换时偏移量是一样的。代码如下:

onScrollBeginDrag (e) {
    if (e.nativeEvent.contentOffset.x !== this.offsetBegin) {
      this.scrollCount += 1
    } else {
      return
    }
    this.offsetBegin = e.nativeEvent.contentOffset.y
 }

onScroll (e) {
    this.offsetEnd = e.nativeEvent.contentOffset.y
 }

onMomentumScrollEnd (e, state) {
    const { urls } = this.state

    let direction = ''
    if (this.offsetEnd - this.offsetBegin > 0) {
      direction = 'right'
    } else if (this.offsetEnd - this.offsetBegin < 0) {
      direction = 'left'
    }
    console.log('滑动方向:', direction)
    console.log('滑动页数:', this.scrollCount)

    this.scrollCount = 0
    this.offsetBegin= -1
    this.offsetEnd = -1
}

总结

如果 slider 不是 loop 的话可以通过 index 来判断,更简单

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant