代码之家  ›  专栏  ›  技术社区  ›  gangrelg

React Native Camera-多张照片

  •  0
  • gangrelg  · 技术社区  · 6 年前

    我目前正在使用react native camera作为库来拍照。我设法显示和隐藏一个唯一的相机组件,这取决于一个特定的状态。我正在开发一个有多个按钮可拍照的应用程序,例如:

    • 按钮A(显示相机->拍照->在本地状态A上存储值)
    • 按钮B(显示相机->拍照->在本地状态B上存储值)
    • 按钮C(显示相机->拍照->在本地状态C上存储值)

    我一直在想怎么做,但想不出来。

    我的代码如下:

    import React, { Component } from 'react';
    import { StyleSheet, Text, TouchableOpacity, View, Button } from 'react-native';
    import { RNCamera } from 'react-native-camera';
    
    export default class BadInstagramCloneApp extends Component {
      constructor(props){
        super(props);
        this.state = {
          isVisible: false,
          value1: null,
          value2: null
        }
      }
    
      render() {
        return (
            <View style={styles.subcontainer}>
              {this.state.isVisible === true
                  ?
                    <View style={styles.container}>
                      <RNCamera
                          ref={ref => {
                            this.camera = ref;
                          }}
                          style={styles.preview}
                          type={RNCamera.Constants.Type.back}
                          flashMode={RNCamera.Constants.FlashMode.on}
                          permissionDialogTitle={'Permission to use camera'}
                          permissionDialogMessage={'We need your permission to use your camera phone'}
                          onGoogleVisionBarcodesDetected={({ barcodes }) => {
                            console.log(barcodes);
                          }}
                      />
                      <View style={{ flex: 0, flexDirection: 'row', justifyContent: 'center' }}>
                        <TouchableOpacity onPress={this.takePicture.bind(this)} style={styles.capture}>
                          <Text style={{ fontSize: 14 }}> SNAP </Text>
                        </TouchableOpacity>
                      </View>
                    </View>
                  :
                    <View>
                      <Button title='PHOTO 1' onPress={this.changeState}/>
                      <Button title='PHOTO 2' onPress={this.changeState2}/>
                      <Button title='SHOW RESULTS' onPress={this.showResults}/>
                    </View>
              }
            </View>
        );
      }
    
      changeState = () =>{
        this.setState({isVisible: true})
      }
    
      changeState2 = () =>{
        this.setState({isVisible: true})
      }
    
      showResults = () => {
        console.log('VALUE1: ' + this.state.value1);
        console.log('VALUE2: ' + this.state.value2);
      }
    
      takePicture = async function() {
        if (this.camera) {
          const options = { quality: 0.5, base64: true };
          const data = await this.camera.takePictureAsync(options);
          console.log(data.uri);
          this.setState({isVisible: false});
        }
      };
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        flexDirection: 'column',
        backgroundColor: 'black'
      },
      subcontainer: {
        flex: 1,
        flexDirection: 'column',
      },
      preview: {
        flex: 1,
        justifyContent: 'flex-end',
        alignItems: 'center',
      },
      capture: {
        flex: 0,
        backgroundColor: '#fff',
        borderRadius: 5,
        padding: 15,
        paddingHorizontal: 20,
        alignSelf: 'center',
        margin: 20,
      },
    });
    0 回复  |  直到 6 年前
        1
  •  1
  •   gbalduzzi    6 年前

    我会用状态来区分你用的是哪个“摄像机”。

    您的初始状态:

    this.state = {
      isVisible: false,
      pictureType: null,
      value1: null,
      value2: null
    }
    

    调用按钮时要调用的函数,其中每个按钮都有不同的 pictureType :

    initTakingPicture = (pictureType) => {
      this.setState({
        isVisible: true,
        pictureType: pictureType
      })
    }
    

    您的示例按钮:

    <Button title='PHOTO 1' onPress={() => this.initTakingPicture("A")}/>
    

    然后在你的 takePicture 函数可以检查状态以区分要拍摄的图片类型并将其保存到“根据”字段中:

      takePicture = async function() {
        if (this.camera) {
          const options = { quality: 0.5, base64: true };
          const data = await this.camera.takePictureAsync(options);
          console.log(data.uri);
          let fieldToSave = "value1" // Fallback
          if (this.state.pictureType === "A") {
            // Operation you need to do for pictureType A
            fieldToSave = "value1"
          } else if (this.state.pictureType === "B") {
            // Operation you need to do for pictureType B
            fieldToSave = "value2"
          } 
    
          this.setState({
            isVisible: false,  
            pictureType: null,
            [fieldToSave]: data.uri
          });
        }
      };
    
    推荐文章