react-native动画滚动视图 onScroll 事件不适用于外部方法

IT技术 reactjs react-native scrollview android-collapsingtoolbarlayout react-animated
2021-05-21 04:34:12

我在 ReactNative 中制作了一个折叠的收费栏,当Animated.ScrollView contentOffset.y 等于 240时,我需要停止动画。如果我在外部函数中放置任何条件或调用 Animated.event 它不起作用。

Animated.Value.stopAnimation() doesn't工作无论是。

这有效:

<Animated.ScrollView
   scrollEventThrottle={1}
   onScroll={
     Animated.event(
       [{nativeEvent: {contentOffset: {y: this.state.scrollY}}}],
       {useNativeDriver: true}
     )
   }
>
...

这不起作用:

handlerScroll() {
  Animated.event(
    [{nativeEvent: {contentOffset: {y: this.state.scrollY}}}]
    {useNativeDriver: true}
  )
}
...
render() {
 return(
   <Animated.ScrollView
      scrollEventThrottle={1}
      onScroll={this.handlerScroll.bind(this)}
    >
 )
}
...

这也不起作用

<Animated.ScrollView
   scrollEventThrottle={1}
   onScroll={
     this.state.canScroll &&
     Animated.event(
       [{nativeEvent: {contentOffset: {y: this.state.scrollY}}}],
       {useNativeDriver: true}
     )
   }
>
...

我不知道我还能用什么来停止我的动画。

我需要做这个效果:

在此处输入图片说明

2个回答
onScroll= {Animated.event(                                         
  [{ nativeEvent: { contentOffset: { y: this. state.scrollY } } }], 
  {                                                                
    useNativeDriver: true,                                         
    listener: event => {                                           
      handlerScroll(event);                             
    },                                                             
  },                                                               
)}                                                                 

https://reactnative.dev/docs/animated#event

与其停止滚动事件映射,为什么不interpolate将动画extrapolate设置为“clamp”?这将阻止您的动画超出输入和输出值的范围。

不确定您要设置动画的样式,但为了显示示例,假设它是一个 translateY 转换:

// onScroll map data to Animated value
onScroll={Animated.event(
    [{ nativeEvent: { contentOffset: { y: this.state.scrollY } } }],
    { useNativeDriver: true }
)}

<Animated.View
    style={{
        transform: [{
            translateY: this.state.scrollY.interpolate({
                inputRange: [0, 240],
                outputRange: [0, -160],
                extrapolate: 'clamp' // clamp so translateY can’t go beyond -160
            })
        }]
    }}
>
    ...
</Animated.View>