React Native Camera - несколько фотографий - PullRequest
1 голос
/ 19 марта 2019

В настоящее время я использую реагирующую камеру в качестве библиотеки для съемки. Мне удалось показать и скрыть один-единственный компонент камеры в зависимости от конкретного состояния. Я работаю над приложением, в котором есть несколько кнопок для фотосъемки, например:

  • Кнопка 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,
  },
});

1 Ответ

1 голос
/ 19 марта 2019

Я бы использовал состояние, чтобы определить, какую «камеру» вы используете.

Ваше начальное состояние:

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
      });
    }
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...