美文网首页
四、项目分析

四、项目分析

作者: 伯纳乌的追风少年 | 来源:发表于2018-03-16 17:47 被阅读0次

    一、App功能介绍:

    这个项目的主要功能有:注册、登录、发送验证码、修改用户头像、修改用户信息、调起相机录制或者调起相册选择和上传视频、调起设备的录音功能录制音频、合并音频和视频并生成一个配音的视频、将生成好的视频同步到云端、视频列表页面、视频详情页面可以播放视频、可以对视频进行评论点赞等操作。
    具体演示:

    多图预警!流量党请谨慎点开!!!

    1、初次安装的话,会进入一个轮播图的页面,用来介绍项目的功能


    点击“马上体验”按钮进入登录页


    2、登录流程

    点击“获取验证码”按钮获取验证码



    由于短信的服务是付费的,因此为了节约学习成本,就在后台直接返回给前端验证码的信息。
    输入验证码后,点击登录,进入App首页


    3、查看已经上传的视频

    首页是上传过的视频列表,可以点击“喜欢”进行点赞,也可以再次点击取消点赞功能



    点击视频进入视频详情页



    可以暂停视频的播放,也可以继续。
    点击评论框可以对当前视频进行评论:


    评论结果会显示在视频详情页下方。

    4、生成视频模块

    点击下方中间按钮可以进入视频制作页面:


    点击“点我上传视频”调出imagePicker插件,可以选择从相册中选择已有视频、也可以直接调用camera现场录制视频:



    由于模拟器中没有相机功能,因此无法演示,我们只演示一下“选择已有视频”的流程,点击选择已有视频后,需要调用相册的权限,会事先询问一下,在这里选择OK就行了。




    进入到相册后,选择一个视频,点击choose进行压缩上传:

    上传视频完成后,进入配音页面



    点击中间的麦克风按钮,开始给当前视频配音

    录音完成,点击下一步设置视频标题

    点击“发布视频”,发布当前视频创意。
    image.png

    发布成功后,会提示“视频发布成功”,此时,在视频列表页就会多出一条视频,且可以点击进入详情页进行播放。



    5、个人账户模块

    点击右侧按钮进入“我的账户”页面


    点击上方“戳这里换头像”区域,可以调起imagePicker模块,拍摄照片或者从相册中选取图片进行更换头像的操作(具体流程与上传视频类似):


    点击右上方编辑按钮,可以进入编辑页面,设置当前用户的信息



    点击“退出登录”,可以退回到登录页面。
    以上就是对这个项目功能方面的总体描述。

    二、项目代码及目录结构:

    代码目录结构

    如上图所示,RN项目有android、ios两个文件夹,这两个文件夹放的是原生的代码,除非要引用一些额外的插件,否则我们在开发业务的过程中不要对它们做过多的修改,以免出现问题。
    node_modules文件夹是项目所安装的npm依赖
    index.js是项目的入口文件
    App.js是项目的首页
    其中index.js在旧版本的RN框架中是分为index.ios.js、index.android.js两个文件,目前在0.51版本的react-native框架下合并成了index.js。
    app文件夹中放的则是该项目的核心业务代码。
    下面重点介绍一下app文件夹中的内容:


    app文件夹中存放了数个文件夹。
    account文件夹存放的是“个人账户页面”、“登录页面”、“初始滑动页面”三个模块
    assets文件夹中存放的是项目的静态资源,这里主要是一些图片
    common文件夹中的是当前项目的公用函数或者配置文件
    creation文件夹存放的是当前项目的“视频列表”和“视频详情”页面
    edit文件夹存放的是当前项目的“生成视频”模块

    三、具体功能的实现方式

    1、初次打开时的轮播图组件的实现:

    轮播组件是在初次进入APP时显示的几张轮播引导图,只在安装后第一次打开App时显示,第二次打开就不会再显示了。

    当应用初次打开时,进入App.js页面,页面的状态中有一个entered属性,初始的时候,它为false,所以此时默认将Slider渲染出来。 当点击“马上体验”之后,将其设置为true,并且设置持久存储:AsyncStorage.setItem('entered', 'yes') 。此时Slider消失,将App主页显示出来。 当下次再进入页面的时候,先判断AsyncStorage里面的entered字段是不是为“yes”,如果是的话就设置当前state中的entered为true,显示App主页。

    轮播图组件应用了react-native-swiper插件,具体插件的用法可以在https://js.coach中查询

    2、react-navigation插件的使用

    该项目的视频列表页进入视频详情页这一过程使用了react-navigation这个插件。
    老版本的react-native的官方插件是:React.Navigator,目前这个插件已经被废弃了,官方目前推荐使用react-navigation插件。
    安装

    yarn add react-navigation
    //或者
    npm install --save react-navigation
    

    官方文档
    使用demo:

    class HomeScreen extends React.Component {
      static navigationOptions = ({ navigation }) => {
        const params = navigation.state.params || {};
    
        return {
          headerLeft: (
            <Button
              onPress={() => navigation.navigate('MyModal')}
              title="Info"
              color="#fff"
            />
          ),
          /* the rest of this config is unchanged */
        };
      };
    
      /* render function, etc */
    }
    
    class ModalScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text style={{ fontSize: 30 }}>This is a modal!</Text>
            <Button
              onPress={() => this.props.navigation.goBack()}
              title="Dismiss"
            />
          </View>
        );
      }
    }
    
    const MainStack = StackNavigator(
      {
        Home: {
          screen: HomeScreen,
        },
        Details: {
          screen: DetailsScreen,
        },
      },
      {
        /* Same configuration as before */
      }
    );
    
    const RootStack = StackNavigator(
      {
        Main: {
          screen: MainStack,
        },
        MyModal: {
          screen: ModalScreen,
        },
      },
      {
        mode: 'modal',
        headerMode: 'none',
      }
    );
    


    3、react-native-image-picker插件的使用

    当我们需要调起设备的相册选取相册或者视频时,当我们需要调起相机拍照或者录制视频时需要用到这一插件。


    插件官方地址:react-native-image-picker
    插件的安装:npm install react-native-image-picker@latest --save
    由于该插件需要引用原生的一些东西,所以需要:react-native link
    做完以上工作还需要进行手动配置:
    ios:
    1、In the XCode's "Project navigator", right click on your project's Libraries folder ➜ Add Files to <...>
    2、Go to node_modules ➜ react-native-image-picker ➜ ios ➜ select RNImagePicker.xcodeproj
    3、Add RNImagePicker.a to Build Phases -> Link Binary With Libraries
    4、For iOS 10+, Add the NSPhotoLibraryUsageDescription, NSCameraUsageDescription, NSPhotoLibraryAddUsageDescription and NSMicrophoneUsageDescription (if allowing video) keys to your Info.plist with strings describing why your app needs these permissions. Note: You will get a SIGABRT crash if you don't complete this step

      <dict>
        ...
        <key>NSPhotoLibraryUsageDescription</key>
        <string>$(PRODUCT_NAME) would like access to your photo gallery</string>
        <key>NSCameraUsageDescription</key>
        <string>$(PRODUCT_NAME) would like to use your camera</string>
        <key>NSPhotoLibraryAddUsageDescription</key>
        <string>$(PRODUCT_NAME) would like to save photos to your photo gallery</string>
        <key>NSMicrophoneUsageDescription</key>
        <string>$(PRODUCT_NAME) would like to your microphone (for videos)</string>
      </dict>
    </plist>
    



    android
    Add the following lines to android/settings.gradle:

    include ':react-native-image-picker'
    project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android')
    

    Update the android build tools version to 2.2.+ in android/build.gradle:

    buildscript {
        ...
        dependencies {
            classpath 'com.android.tools.build:gradle:2.2.+' // <- USE 2.2.+ version
        }
        ...
    }
    ...
    

    Update the gradle version to 2.14.1 in android/gradle/wrapper/gradle-wrapper.properties:

    ...
    distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
    Add the compile line to the dependencies in android/app/build.gradle:
    
    dependencies {
        compile project(':react-native-image-picker')
    }
    

    Add the required permissions in AndroidManifest.xml:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    Add the import and link the package in MainApplication.java:
    
    import com.imagepicker.ImagePickerPackage; // <-- add this import
    
    public class MainApplication extends Application implements ReactApplication {
        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                new MainReactPackage(),
                new ImagePickerPackage() // <-- add this line
                // OR if you want to customize dialog style
                new ImagePickerPackage(R.style.my_dialog_style)
            );
        }
    }
    

    使用方法:

    var ImagePicker = require('react-native-image-picker');
    
    // More info on all the options is below in the README...just some common use cases shown here
    var options = {
      title: 'Select Avatar',
      customButtons: [
        {name: 'fb', title: 'Choose Photo from Facebook'},
      ],
      storageOptions: {
        skipBackup: true,
        path: 'images'
      }
    };
    
    /**
     * The first arg is the options object for customization (it can also be null or omitted for default options),
     * The second arg is the callback which sends object: response (more info below in README)
     */
    ImagePicker.showImagePicker(options, (response) => {
      console.log('Response = ', response);
    
      if (response.didCancel) {
        console.log('User cancelled image picker');
      }
      else if (response.error) {
        console.log('ImagePicker Error: ', response.error);
      }
      else if (response.customButton) {
        console.log('User tapped custom button: ', response.customButton);
      }
      else {
        let source = { uri: response.uri };
    
        // You can also display the image using data:
        // let source = { uri: 'data:image/jpeg;base64,' + response.data };
    
        this.setState({
          avatarSource: source
        });
      }
    });
    

    Then later, if you want to display this image in your render() method:

    <Image source={this.state.avatarSource} style={styles.uploadAvatar} />
    

    To Launch the Camera or Image Library directly (skipping the alert dialog) you can do the following:

    // Launch Camera:
    ImagePicker.launchCamera(options, (response)  => {
      // Same code as in above section!
    });
    
    // Open Image Library:
    ImagePicker.launchImageLibrary(options, (response)  => {
      // Same code as in above section!
    });
    


    4、react-native-audio插件的使用

    破坏性升级:
    For React Native >= 0.47.2, use v3.4.0 and up.
    For React Native >= 0.40, use v3.1.0 up til 3.2.2.
    For React Native <= 0.39, use v3.0.0 or lower.

    v4.0 introduced a breaking change to the API to introduce distinct pause and resume methods.

    v3.x removed playback support in favor of using more mature libraries like react-native-sound. If you need to play from the network, please submit a PR to that project or try react-native-video.

    安装:

    npm install react-native-audio --save
    react-native link react-native-audio
    

    在iOS中需要对Info.plist中增加对麦克风的允许:

    <key>NSMicrophoneUsageDescription</key>
    <string>This sample uses the microphone to record your speech and convert it to text.</string>
    

    在Android中需要在 AndroidManifest.xml中:

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    



    手动安装:
    如果你使用了 react-native link就不需要做以下配置了

    Edit android/settings.gradle to declare the project directory:

    include ':react-native-audio'
    project(':react-native-audio').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-audio/android')
    

    Edit android/app/build.gradle to declare the project dependency:

    dependencies {
      ...
      compile project(':react-native-audio')
    }
    

    Edit android/app/src/main/java/.../MainApplication.java to register the native module:

    import com.rnim.rn.audio.ReactNativeAudioPackage; // <-- New
    ...
    
    public class MainApplication extends Application implements ReactApplication {
      ...
      @Override
      protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(
            new MainReactPackage(),
            new ReactNativeAudioPackage() // <-- New
        );
      }
    
    



    使用:

    import {AudioRecorder, AudioUtils} from 'react-native-audio';
    let audioPath = AudioUtils.DocumentDirectoryPath + '/test.aac';
    
    AudioRecorder.prepareRecordingAtPath(audioPath, {
      SampleRate: 22050,
      Channels: 1,
      AudioQuality: "Low",
      AudioEncoding: "aac"
    });
    

    相关文章

      网友评论

          本文标题:四、项目分析

          本文链接:https://www.haomeiwen.com/subject/fgqofftx.html