在 react-native 中找出滚动方向 listview/scrollview

Finding out scroll direction in react-native listview/scrollview

有没有办法找出 react-native 的 listview/scrollview 组件的滚动方向?

原生 iOS 组件似乎可以通过计算 scrollViewWillBeginDraggingscrollViewDidScroll 的偏移量来实现,但似乎没有这些绑定。

您可以使用 ScrollView 的 onScroll 事件,并在事件回调中检查 contentOffset:

https://rnplay.org/apps/FltwOg

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  ScrollView,
  Text,
  View,
} = React;

var SampleApp = React.createClass({
  offset: 0,
  onScroll: function(event) {
    var currentOffset = event.nativeEvent.contentOffset.y;
        var direction = currentOffset > this.offset ? 'down' : 'up';
    this.offset = currentOffset;
    console.log(direction);
  },
  render: function() {
    return (
      <View style={styles.container}>
        <ScrollView style={styles.scroller} onScroll={this.onScroll}>
          <Text>Scrollable content here</Text>
        </ScrollView>
      </View>
    )
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 50,
  },
  scroller: {
    height: 5000,
  },
});

AppRegistry.registerComponent('SampleApp', () => SampleApp);

当新旧偏移之间的差异非常小时,alexp 的解决方案无法准确指定方向,我遇到了问题。所以我把它们过滤掉了。

  _onScroll = event => {
    const currentOffset = event.nativeEvent.contentOffset.y;
    const dif = currentOffset - (this.offset || 0);

    if (Math.abs(dif) < 3) {
      console.log('unclear');
    } else if (dif < 0) {
      console.log('up');
    } else {
      console.log('down');
    }

    this.offset = currentOffset;
  };