javascript - 基于多个 ScrollView(s) 为单个 View 设置动画

标签 javascript android ios animation react-native

我正在开发一个应用程序,我正在尝试根据多个 ScrollView 的滚动位置对 View 进行动画处理。

这就是屏幕的样子。

Profile Screen

上面的屏幕有2个部分

  • 顶部的View组件
  • 底部的 TabNavigator 组件

TabNavigator 中的每个选项卡都有一个 ScrollView (在这种情况下有 2 个但可以更多),我想要实现的是折叠 View 当用户向下滚动并在用户向上滚动时展开。 在一个选项卡上我做得很好,它完全按照我想要的方式工作,但是当我添加第二个选项卡时问题就来了。

问题

当我在 tab1 上滚动一点并移动到 tab2 并尝试滚动时,它会变得生涩。查看 GIF 以了解我想说的内容

React Native Animation Jerk


更新

在 expo.io 上查看此零食以实时查看问题

snack.expo.io/SytBkdBAW


我尝试了什么

App.js

export default class App extends Component {

  constructor (props) {
    super(props)

    this.state = {
      /* omitted - not related */
      scrollY: new Animated.Value(0)
    }
  }

  render () {

    let translateY = this.state.scrollY.interpolate({
      inputRange: [0, 600],
      outputRange: [0, -290],
      extrapolate: 'clamp'
    });

    let TabsTranslateY = this.state.scrollY.interpolate({
      inputRange: [0, 600],
      outputRange: [0, -290],
      extrapolate: 'clamp'
    });

    return (
      <View style={styles.container}>
        <Animated.View style={{transform: [{translateY: translateY}], overflow: 'hidden'}}>
          <Text style={styles.welcome}>
            Welcome to React Native!!
          </Text>

          <Text style={styles.time}>
            {this.state.hour} : {this.state.minute}
          </Text>

          <TouchableOpacity onPress={() => { /* omitted */ }} style={styles.button}><Text style={styles.buttonText}>Set Time</Text></TouchableOpacity>
        </Animated.View>
        <Animated.View style={{
          flex: 0,
          transform: [{translateY: TabsTranslateY}],
          height: Dimensions.get('window').height
        }}>
          <Tabs removeClippedSubviews={false} screenProps={{animatedScrollY: this.state.scrollY}}/>
        </Animated.View>
      </View>
    )
  }
}

const styles = StyleSheet.create({/* omitted styles*/})

Home.js (Tab1)

/* omitted imports */
export default class Home extends Component {
  /* omitted navigation options */
  constructor (props) {
    super(props)

    this.state = {
      scrollY: this.props.screenProps.animatedScrollY
    }

  }

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

          {Array(90).fill().map((v, i) => {
            return <Text key={i}
                         style={{flex: 1, backgroundColor: '#333', padding: 20, marginVertical: 10, color: 'white'}}>Item
              #{i + 1}</Text>
          })}
        </Animated.ScrollView>
      </View>
    )
  }
}

Photos.js (Tab2)

/* omitted imports */
export default class Photos extends Component {
  /* omitted navigation options */
  constructor (props) {
    super(props)

    this.state = {
      PhotosScrollY: this.props.screenProps.animatedScrollY
    }
  }

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

        <View style={{flex: 1,}}>
          {Array(90).fill().map((v, i) => {
            return <View key={i} style={/* omitted */}>
              <Text style={/* omitted */}>
                Photo #{i + 1}
              </Text>
            </View>
          })}
        </View>

      </Animated.ScrollView>
    )
  }
}

我不知道如何解决这个问题,任何建议和解决方案都非常感谢。

谢谢。

最佳答案

尝试使用Animated.add()

所以你需要在App

const tab1ScrollY = new Animated.Value(0)
const tab2ScrollY = new Animated.Value(0)
const scrollY = Animated.add(tab1ScrollY,tab2ScrollY)

scrollY 它是 tab1 scroll + tab2 scroll

的偏移量

关于javascript - 基于多个 ScrollView(s) 为单个 View 设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980077/

相关文章:

javascript - Google 跟踪代码管理器中的简单 DOM 属性匹配

android - 启动 Dagger2,如何构建结构?

ios - [String!] 和 [String] 有什么区别!

ios - ASIHTTPRequestErrorDomain 代码=3 需要身份验证

ios - 使用 CoreText 和 CTFontDescriptor 设置字体粗细

javascript - KendoUI 条形图 - PlotArea 未按假设工作

javascript - 在 JavaScript 中合并两个图像

任何语言的小写Javascript测试字符串

java - 从数据库内容填充微调器 (SQLite)

android - res文件夹中的可绘制文件夹?