34

こんにちは、以下のリンクscrollviewのように中央にスナップしようとしていますgif

このGIFをチェック

しかし、そうすることができません。以下は、これを達成するための私の反応ネイティブコードです。

または Android のような scrollview 要素の特定のインデックスにスクロールする方法はありますか?

どんな助けでも大歓迎です。前もって感謝します

<ScrollView
  style={[styles.imgContainer,{backgroundColor:colorBg,paddingLeft:20}]}
  automaticallyAdjustInsets={false}
  horizontal={true}
  pagingEnabled={true}
  scrollEnabled={true}
  decelerationRate={0}
  snapToAlignment='center'
  snapToInterval={DEVICE_WIDTH-100}
  scrollEventThrottle={16}
  onScroll={(event) => {
    var contentOffsetX=event.nativeEvent.contentOffset.x;
    var contentOffsetY=event.nativeEvent.contentOffset.y;

    var  cellWidth = (DEVICE_WIDTH-100).toFixed(2);
    var cellHeight=(DEVICE_HEIGHT-200).toFixed(2);

    var  cellIndex = Math.floor(contentOffsetX/ cellWidth);

    // Round to the next cell if the scrolling will stop over halfway to the next cell.
    if ((contentOffsetX- (Math.floor(contentOffsetX / cellWidth) * cellWidth)) > cellWidth) {
      cellIndex++;
    }

    // Adjust stopping point to exact beginning of cell.
    contentOffsetX = cellIndex * cellWidth;
    contentOffsetY= cellIndex * cellHeight;

    event.nativeEvent.contentOffsetX=contentOffsetX;
    event.nativeEvent.contentOffsetY=contentOffsetY;

    // this.setState({contentOffsetX:contentOffsetX,contentOffsetY:contentOffsetY});
    console.log('cellIndex:'+cellIndex);

    console.log("contentOffsetX:"+contentOffsetX);
      // contentOffset={{x:this.state.contentOffsetX,y:0}}
  }}
>
  {rows}

</ScrollView>
4

6 に答える 6

76

ScrollView で実行できる他のライブラリは必要ありません。必要なのは、コンポーネントに次の小道具を追加することだけです。

    horizontal= {true}
    decelerationRate={0}
    snapToInterval={200} //your element width
    snapToAlignment={"center"}

実装方法の詳細については、このスナックを確認して ください https://snack.expo.io/H1CnjIeDb

于 2017-08-03T08:31:49.150 に答える
9

pagingEnabledでプロパティを使用しますScrollView

const screenHeight = Dimensions.get('window').height;

class Screen extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <ScrollView pagingEnabled>
        <Page1 style={{height: screenHeight}} />
        <Page2 style={{height: screenHeight}} />
      </ScrollView>
    );
  }
}
于 2019-01-15T05:23:45.470 に答える
3

長いリストのずれのために snapToInterval を使用したくない場合は、より正確な snapToOffsets を使用できます。

例えば:

const { width } = Dimensions.get('window');
this.IMAGE_WIDTH = width * (1 / 2.5)
this.image_margin = 5
this.nishhar = width - ((this.IMAGE_WIDTH + this.image_margin) * 2 + this.image_margin * 2)

dataNum = [1, 2, 3, 4, 5, 6]

return (<FlatList
            data={dataNum}
            renderItem={item => {
                return (
                    <View style={{
                        backgroundColor: item.index % 2 == 0 ? 'red' : 'blue',
                        width: this.IMAGE_WIDTH,
                        height: this.IMAGE_WIDTH,
                        marginLeft: this.image_margin,
                        marginRight: this.image_margin,
                    }}>
                    </View>)
            }}
            keyExtractor={this.keyGenerator}
            horizontal={true}
            snapToAlignment={"start"}
            snapToOffsets={[...Array(dataNum.length)].map((x, i) => (i * (this.IMAGE_WIDTH + 2 * this.image_margin) - (this.nishhar * 0.5)))}
            decelerationRate={"fast"}
            pagingEnabled
        />)

または、この例をチェックアウトすることもできます: https://snack.expo.io/SyWXFqDAB

于 2019-12-18T12:26:02.777 に答える
1

いくつかのオプションがあります。ここに私が試してうまくいった2つがあります。そのドキュメントが言うように、「ListViewのように、これはパフォーマンスの問題なしに何百ものページをレンダリングできる」ため、私は2番目のものを好みます。

  1. 反応ネイティブページスワイパー
  2. 反応ネイティブビューページャー
于 2016-10-05T01:41:58.307 に答える