反应本地动画无法正常工作

时间:2019-11-30 11:23:29

标签: react-native

我正在尝试创建动画标题,在滚动时像uber的标题一样更改高度,fontSize和位置

可以,但是不流畅

当我缓慢滚动时,它会很快摇动

构造函数:

  constructor(props) {
super(props);
this.state = {
  fontSizeAnimation: new Animated.Value(30),
  positionX: new Animated.Value(0),
  positionY: new Animated.Value(0),
  height: new Animated.Value(0),
  positionAnimation: new Animated.ValueXY(),
  scrollY: 0,
  counter: 0,
}

}

动画功能:

  animateTitle = (e) => {
  const scrollY = e.nativeEvent.contentOffset.y;
  if(scrollY - this.state.scrollY > 5 || scrollY - this.state.scrollY < -5) {
    this.setState({counter: this.state.counter+1})
    this.setState({scrollY});
    Animated.parallel([
      Animated.timing(this.state.height, {
        toValue: this.state.scrollY,
        duration: 0,
        easing: Easing.linear
      }),
      Animated.timing(this.state.fontSizeAnimation, {
        toValue: this.state.scrollY,
        duration: 0,
        easing: Easing.linear
      })
    ]).start(() => {
      this.state.positionAnimation.setValue({
        x: this.state.scrollY > 50? 50 : this.state.scrollY,
        y: this.state.scrollY > 50? -50 : -this.state.scrollY,
      }) 
    })    
  }

}

渲染功能:

  render() {
const interpolatedFontSize = this.state.fontSizeAnimation.interpolate({
  inputRange: [0, 50],
  outputRange: [30, 20],
  extrapolate: "clamp"
});
const interpolatedHeight = this.state.height.interpolate({
  inputRange: [0, 50],
  outputRange: [120, 60],
  extrapolate: "clamp"
});
return (
  <View>
      <Animated.View style={[styles.header, {height: interpolatedHeight}]}>
        <Image source={require("./images/back-button.png")} style={styles.back} />
        <Animated.Text style={[styles.title, { fontSize: interpolatedFontSize, transform: this.state.positionAnimation.getTranslateTransform() }]}>Title</Animated.Text>
      </Animated.View>
      <ScrollView
        onScroll={(e) => this.animateTitle(e)}
        contentContainerStyle={{minHeight: "100%", height: 1000, backgroundColor: "grey"}}
        >
          <View style={{height: 800, backgroundColor: "red", width: "100%", marginBottom: 10}}>
          </View>
      </ScrollView>
  </View>
)

} }

样式:

const styles = StyleSheet.create({

后退:{     位置:“绝对”,     最高:20     左:10,     高度:30,     宽度:30   },   标题:{     位置:“绝对”,     paddingTop:5     最高:60     左:10   },   标头:{     位置:“相对”,     backgroundColor:“灰色”,   } });

2 个答案:

答案 0 :(得分:1)

您的动画当前正在JS线程上运行。您可以通过以下方式轻松地将动画移动到本地线程:

Animated.timing(this.state.animatedValue, {
  toValue: 1,
  duration: 500,
  useNativeDriver: true, // <-- Adding this line
}).start();

使用本机驱动程序可以提高性能,因为它将JS线程清除为其他任务。试试吧!

答案 1 :(得分:0)

如果要平滑地布局动画(在这种情况下为LayoutAnimation),则应使用height。这是link入门指南。