【问题标题】:How to rebuild the iOS Picker animation in React Native如何在 React Native 中重建 iOS Picker 动画
【发布时间】:2019-03-01 10:11:23
【问题描述】:

React Native 有没有办法完全用 Java Script 重新构建 iOS 选择器组件?我不需要普通的选择器,而是一个普通的滚动视图,它具有与 iOS 选择器类似的淡出效果。

编辑——我认为我没有完全解释我最初的答案。这就是我在这里完成它的原因:

我想构建一个占据整个屏幕的滚动视图。它不应该给用户选择某些项目的可能性,就像 iOS Picker 所做的那样。尽管如此,它应该是一个“正常”的滚动视图,向用户显示一些信息,例如不同的聊天、任务、新闻等等。

与 React Native 的普通滚动视图的唯一区别应该是顶部的淡出效果:当用户向上滚动内容时,它不应该只是将屏幕留在顶部边缘,而是应该使用 iOS Picker 的淡出效果(见图)。

这种淡出效果由两部分组成:首先,它通过降低 y 坐标来提高内容的透明度。此外,这些内容似乎逃到了三维空间中。

我的问题是,我看不到在 React Native 中实现这种三维内容的方法。我要补充一点,我的滚动视图中的内容不包含大小相同的小项目(例如文本“项目 1”、“项目 2”、“项目 3”……),但更大具有不同大小的项目,例如图像或整个文本框。

【问题讨论】:

    标签: javascript ios react-native scrollview picker


    【解决方案1】:

    您可以使用 Animated api 实现所需的效果。这个想法是为列表中的项目设置不同的输入范围。然后,您将不透明度与 ScrollView(或任何列表组件)的滚动值挂钩。我已经简化了代码,但应该足以证明这个想法。

    下面的示例仅演示了不透明效果,但您可以轻松添加翻译效果以获得您正在寻找的确切动画。

    
    const data = []; // array that contains the text
    const items = [];
    for (let i = 0; i < data.length; ++i) {
      const distanceFromViewCenter = Math.abs(i * ITEM_HEIGHT);
      const inputRange = [
        -distanceFromViewCenter - 2 * ITEM_HEIGHT,
        -distanceFromViewCenter - ITEM_HEIGHT,
        -distanceFromViewCenter, // Middle of picker            
        -distanceFromViewCenter + ITEM_HEIGHT,
        -distanceFromViewCenter + 2 * ITEM_HEIGHT,
      ];
      items.push(
        <Animated.View
          style={{
            opacity: this._scrollValue.interpolate({
              inputRange,
              outputRange: [0.0, 0.3, 1.0, 0.3, 0.0],
            }),
          }}
        >
          <Text style={{ height: ITEM_HEIGHT }}>{data[i]}</Text>
        </Animated.View>
      )
    }
    
    <ScrollView
      onScroll={Animated.event(
        [{ nativeEvent: { contentOffset: { y: this._scrollValue } } }],
        { useNativeDriver: true }
      )}
    >
      {items}
    </ScrollView>
    

    【讨论】:

      【解决方案2】:

      您可以使用此NPM module 来获得您想要的东西。该模块在 Android 和 iOS 中的工作方式相同。不要重新发明轮子:)

      编辑:现在我明白你想要什么了。你可以尝尝我为你做的这种小吃:

      https://snack.expo.io/r1qnxSt9m

      当然你需要改进它,但这只是一个开始。

      【讨论】:

      • 谢谢你的回答,但我想,你误解了我的问题。我不想重建整个 Picker,只想重建它的淡出效果。我想将此效果应用于一个常见的滚动视图,我在我的应用程序中使用它在其顶部有一个很好的淡出......
      • @Paul 你可以下载我之前提到的 NPM 模块的源代码。看看它是如何产生这种效果的。我认为它使用 react-native-animatable (github.com/oblador/react-native-animatable)
      • @shimatai 谢谢你的想法!不幸的是,react-native-simple-picker 使用了 React Natives 的 Picker 组件,而后者又使用了 iOS 的 native picker 组件。这意味着,所需的淡出效果不直接包含在 react-native-simple-picker 中。你有什么其他想法可以在 React Native 中达到预期的效果吗?我会看看 react-native-animatable...
      • @Paul 如果您使用的是ListView 组件,则在renderRow 方法上,您可以将自定义样式应用于当前项目。如果当前项目不是选定的项目,则可以应用该淡入淡出样式。 renderRow 方法的 rowID 可以让您知道您在数组的哪个位置。
      • @shimatai 非常感谢您的帮助。我想,我没有完全解释我的要求。这就是为什么我更新了我最初的问题。
      猜你喜欢
      • 2021-05-11
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多