在本教程中,我们将以复制当前的Apple应用为例来创建React Native共享元素过渡。 本教程将解决使用React Animation和Dimensions使图像看起来很酷的有趣方面。 在这里,我们将不使用任何外部react插件。 所有必需的组件(如图像,动画,尺寸)均由react-native包提供。 教程的灵感来自React本机电子商务模板

这个想法是从简单的React Native项目开始的。 然后,我们将添加图像,并使用react-native包中的不同组件包装图像,并对其进行配置以实现react-native共享元素转换。

所以,让我们开始吧!

从一个空项目开始

首先,我们将创建一个启动样板React Native应用程序。 为此,我们需要在所需目录中运行以下命令:



>>react-native init <example-app>



在完成空白的本地反应应用程序的安装之后,我们将使用以下命令在iOS模拟器中运行该应用程序:



>>>react-native run-ios



结果,我们将在模拟器屏幕中获得以下结果:




苹果官方的应用内购买JavaSDK apple app内购买项目要付费吗_javascript


添加映像并对其进行配置

现在,我们将图像添加到我们的应用程序。 为此,我们需要从App.js文件中删除所有不必要的代码。 然后,我们需要将以下代码添加到App.js文件中。 图像是从图像目录中导入的。 我们可以在项目源目录中创建自己的图像目录,添加我们自己的图像,然后将它们导入数组常量,如下面的代码片段所示:


import React from 'react' ;
import {View} from 'react-native' ;

const images = [
  { id : 1 , src : require ( './image/1.jpeg' )},
  { id : 2 , src : require ( './image/2.jpeg' )},
  { id : 3 , src : require ( './image/3.jpeg' )},
  { id : 4 , src : require ( './image/4.jpeg' )},
];
export default class App extends React . Component  {
  render() {
    return < View > </ View > ;
  }
}


在上面的代码段中,我们只包括了react-native包中的images常量和一个View组件。 因此,如果我们重新运行该应用程序,它将在模拟器中显示为空白。

因此,为了将导入的图像添加到屏幕中,我们将用ScrollView组件替换View组件,以便我们可以通过上下滚动屏幕来查看屏幕上的图像。 然后,我们将使用map函数将图像映射到屏幕上,该函数可帮助我们遍历数组并返回JSX元素。 在这里,我们从map函数返回的元素是Image组件,其中集成了导入的图像。 为此,我们可以使用以下代码片段中提供的代码:


import React from 'react' ;
import {Image, ScrollView} from 'react-native' ;

const images = [
  { id : 1 , src : require ( './image/1.jpeg' )},
  { id : 2 , src : require ( './image/2.jpeg' )},
  { id : 3 , src : require ( './image/3.jpeg' )},
  { id : 4 , src : require ( './image/4.jpeg' )},
];
export default class App extends React . Component  {
  render() {
    return (
      < ScrollView style = {{flex: 1 }}>
        {images.map(image => {
          return  <Image key={image.id} source={image.src} />;
        })}
      </ScrollView> 
    );
  }
}


结果,我们将在模拟器中获得以下屏幕:


苹果官方的应用内购买JavaSDK apple app内购买项目要付费吗_苹果官方的应用内购买JavaSDK_02


正如我们在上面的仿真器仿真中所看到的那样,图像出现在屏幕上,因此可以滚动。

包装图像

下一步是使用TouchableWithOutFeedBackAnimated View组件包装Image组件,以便在触摸时创建动画。 TouchableWithOutFeedBack组件用于使图像可单击,而无需在屏幕上提供任何反馈,而Animated View组件使图像具有适当的视图动画效果。 因此,下面的代码片段中提供了实现此目的的代码:


import React from 'react' ;
import {
  Image,
  ScrollView,
  TouchableWithoutFeedback,
  Animated,
} from 'react-native' ;

const images = [
  { id : 1 , src : require ( './image/1.jpeg' )},
  { id : 2 , src : require ( './image/2.jpeg' )},
  { id : 3 , src : require ( './image/3.jpeg' )},
  { id : 4 , src : require ( './image/4.jpeg' )},
];
export default class App extends React . Component  {
  render() {
    return (
      < ScrollView style = {{flex: 1 }}>
        {images.map(image => {
          return (
             <TouchableWithoutFeedback key={image.id}>
              <Animated.View>
                <Image source={image.src} />
              </Animated.View>
            </TouchableWithoutFeedback>
          );
        })}
      </ScrollView>
    );
  }
}


将尺寸配置添加到带有尺寸组件的图像

在此步骤中,我们将基于屏幕尺寸配置图像的高度和宽度。 为了获得屏幕的高度和宽度,我们将使用react-native软件包提供的Dimensions组件。 Dimensions组件提供了get()函数,通过该函数我们可以获取全屏窗口的宽度和高度。 在这里,我们将这些屏幕窗口的高度和宽度存储到两个变量中,即SCREEN_WIDTHSCREEN_HEIGHT ,如下面的代码片段所示:


Image,
  ScrollView,
  TouchableWithoutFeedback,
  Animated,
  Dimensions,
} from 'react-native' ;
let SCREEN_WIDTH = Dimensions.get( 'window' ).width;
let SCREEN_HEIGHT = Dimensions.get( 'window' ).height;


然后,我们将这些尺寸样式配置添加到Animated View组件中, 高度降低了150,如下面的代码片段所示:


<TouchableWithoutFeedback key={image.id}>
     < Animated.View
               style = {{
                 height: SCREEN_HEIGHT - 150 ,
                 width: SCREEN_WIDTH ,
                 padding: 15 ,
               }}>
           <Image source={image.src} />
     </Animated.View>
</TouchableWithoutFeedback>


因此,我们在模拟器屏幕上得到以下结果:


苹果官方的应用内购买JavaSDK apple app内购买项目要付费吗_苹果官方的应用内购买JavaSDK_03


向图像添加样式

这一步很简单。 我们只是将一些内联样式添加到Image组件中,以使其看起来更具吸引力。 我们将使用样式属性添加内联样式,如下面的代码片段所示:


<TouchableWithoutFeedback key={image.id}>
             < Animated.View
               style = {{
                 height: SCREEN_HEIGHT - 150 ,
                 width: SCREEN_WIDTH ,
                 padding: 15 ,
               }}>
                <Image
                 source={image.src}
                 style={{
                   flex: 1,
                   height: null,
                   width: null,
                   resizeMode: 'cover',
                   borderRadius: 20,
                 }}
               />
             </Animated.View>
</TouchableWithoutFeedback>


因此,我们在模拟器屏幕上获得了以下结果,其中图像看起来比以前更好。


苹果官方的应用内购买JavaSDK apple app内购买项目要付费吗_javascript_04


但是,正如我们所看到的,模拟器的状态栏覆盖在应用程序的图像上。

因此,为了解决此问题,我们将添加一个SafeAreaView容器。 SafeAreaView组件的功能是在设备的安全区域边界内呈现内容。 因此,我们将用SafeAreaView组件包装ScrollView组件,如下面的代码片段所示:


import React from 'react' ;
import {
  Image,
  ScrollView,
  TouchableWithoutFeedback,
  Animated,
  Dimensions,
  SafeAreaView,
} from 'react-native' ;

const images = [
  { id : 1 , src : require ( './image/1.jpeg' )},
  { id : 2 , src : require ( './image/2.jpeg' )},
  { id : 3 , src : require ( './image/3.jpeg' )},
  { id : 4 , src : require ( './image/4.jpeg' )},
];
let SCREEN_WIDTH = Dimensions.get( 'window' ).width;
let SCREEN_HEIGHT = Dimensions.get( 'window' ).height;
export default class App extends React . Component  {
  render() {
    return (
      < SafeAreaView style = {{flex: 1 }}>
         <ScrollView style={{flex: 1}}>
          {images.map(image => {
            return (
              <TouchableWithoutFeedback key={image.id}>
                <Animated.View
                  style={{
                    height: SCREEN_HEIGHT - 150,
                    width: SCREEN_WIDTH,
                    padding: 15,
                  }}>
                  <Image
                    source={image.src}
                    style={{
                      flex: 1,
                      height: null,
                      width: null,
                      resizeMode: 'cover',
                      borderRadius: 20,
                    }}
                  />
                </Animated.View>
              </TouchableWithoutFeedback>
            );
          })}
        </ScrollView>
      </SafeAreaView>
    );
  }
}


因此,我们在模拟器屏幕上得到以下结果:


苹果官方的应用内购买JavaSDK apple app内购买项目要付费吗_苹果官方的应用内购买JavaSDK_05


最后,我们的React Native共享元素过渡实现成功。

结论

在本教程的第一部分中,我们学习了如何设置空白的React本机应用程序。 我们还学习了如何使用本机包中的不同组件。 此外,我们还获得了有关如何为动画设置图像UI以及如何使用Dimensions,ScrollView和SafeAriaView组件的详细指南。 最后,我们成功完成了React Native共享元素过渡的实现。