улучшение стилей элементов для полноэкранного сканирования

#react-native #styles

#react-native #стили

Вопрос:

Мне понадобится помощь, чтобы отредактировать эту страницу. у меня есть все элементы, но мне нужна помощь в стилизации. Я хотел бы, чтобы камера (изображение, которое вы видите, было типичной камерой эмулятора, поэтому она создает изображение) была в полноэкранном режиме и сверху вверху, сообщение красным цветом и «автозаполнение». Если вы хотите, чтобы объяснить лучше, я хотел бы обратить внимание на изображение ниже: автозаполнение в левом верхнем углу над камерой в полноэкранном режиме.

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

введите описание изображения здесь

 const autocompletes = [...Array(10).keys()];

const apiUrl = "https://5b927fd14c818e001456e967.mockapi.io/branches";


class Tickets extends Component {
  constructor(props) {
    super(props);
    this.state = {
      Press: false,
      hasCameraPermission: null,
      reference: '',
      lastScannedUrl:null,
      displayArray: []      
    };
  }

   initListData = async () => {
    let list = await getProductByRef(1);
   
    if (list) {
      this.setState({
        displayArray: list,
        reference: list.reference
      });      
    }
   // console.log('reference dans initListData =', list.reference)
  };

  async UNSAFE_componentWillMount() {
    this.initListData();
   // console.log('reference dans le state =', this.state.reference)

};

  componentDidMount() {
    this.getPermissionsAsync(); 
  }

  getPermissionsAsync = async () => {
    const { status } = await Permissions.askAsync(Permissions.CAMERA);
    this.setState({ hasCameraPermission: status === "granted" });
  };

  _onPress_Scan = () => {
    this.setState({
      Press: true
    });
  }

  handleBarCodeScanned = ({ type, data }) => {
    this.setState({ Press: false, scanned: true, reference: data });
    this.props.navigation.navigate('ProductDetails', {reference : parseInt(this.state.state.reference)})
  };

  renderBarcodeReader = () => {
    const { hasCameraPermission, scanned } = this.state;

    if (hasCameraPermission === null) {
      return <Text>{i18n.t("scan.request")}</Text>;
    }
    if (hasCameraPermission === false) {
      return <Text>{i18n.t("scan.noaccess")}</Text>;
    }
    return (
      <View
        style={{
          flex: 1,
          ...StyleSheet.absoluteFillObject
        }}
      >        
        <BarCodeScanner
          onBarCodeScanned={scanned ? undefined : this.handleBarCodeScanned}
          style={{ flex:1, height:'100%', ...StyleSheet.absoluteFillObject}}
        />
        {scanned amp;amp; (
          <Button
            title={"Tap to Scan Again"}
            onPress={() => this.setState({ scanned: false })}
          />
        )}    
      </View>
    );
  }
  handleSelectItem(item, index) {
    const {onDropdownClose} = this.props;
    onDropdownClose();
    console.log(item);
  }
  render() {
    const { hasCameraPermission, scanned, Press } = this.state;
    let marker = null;

    const {scrollToInput, onDropdownClose, onDropdownShow} = this.props;

 // console.log('displayArray', this.state.displayArray, 'reference', this.state.displayArray.reference)
    return (
           <View style={styles.container}>           
    {Press ? (
      <View style={{flex:1}}>
        <View style={styles.dropdownContainerStyle}>            
          <Autocomplete
            key={shortid.generate()}
            containerStyle={styles.autocompleteContainer}
            inputStyle={{ borderWidth: 1, borderColor: '#F78400'}}
            placeholder={i18n.t("tickets.warning")}
            pickerStyle={styles.autocompletePicker}
            scrollStyle={styles.autocompleteScroll}
            scrollToInput={ev => scrollToInput(ev)}
            handleSelectItem={(item, id) => this.handleSelectItem(item, id)}
            onDropdownClose={() => onDropdownClose()}
            onDropdownShow={() => onDropdownShow()}              
            fetchDataUrl={apiUrl}
            minimumCharactersCount={2}
            highlightText
            valueExtractor={item => item.name}
            rightContent
            rightTextExtractor={item => item.properties}
          />
        </View>
        {this.renderBarcodeReader()}
      </View>
    ) : (
      <View style={{flex:1, justifyContent:'center', alignItems:'center'}}>
        <Button
          color="#F78400"
          title={i18n.t("scan.scan")}
          onPress={this._onPress_Scan}>                    
        </Button>
      </View>
    )}                
  </View>
    );
  }
}
export default Tickets;
 

Это дает мне (после нажатия кнопки) :

ТЕСТ КОДА SNACK

screencapture

Комментарии:

1. Не могли бы вы точно объяснить, чего вы пытаетесь достичь? Вы написали что-то об «автозаполнении», но я не вижу автозаполнения на изображениях. Вам нужна помощь на втором изображении, которое вы добавили?

2. извините, я обновил свой пост. Ввод автозаполнения — это то, где написано «выбрать событие перед сканированием», и то, что я хочу сделать, это сделать, как на первом снимке экрана. С полноэкранной камерой и автозаполнением ввода «выше» (например, зеленая кнопка на первом изображении) Ссылка на закуску работает, если вы хотите попробовать 🙂 спасибо за ваше время

Ответ №1:

Я заметил, что вы используете компонент из Expo под названием BarcodeScanner

На github открыта проблема, связанная с тем фактом, что этот компонент невозможно настроить для полноэкранного режима: https://github.com/expo/expo/issues/5212

Однако один пользователь предлагает хорошее решение: заменить BarCodeScanner на Camera и использовать barcodescannersettings

Вот ссылка для ответа на вопрос GitHub: https://github.com/expo/expo/issues/5212#issuecomment-653478266

Ваш код должен выглядеть примерно так:

 renderBarcodeReader = () => {
    const { hasCameraPermission, scanned } = this.state;

    [ ... ] // the rest of your code here

    return (
      <View
        style={{
        flex: 1,
        ...StyleSheet.absoluteFillObject
      }}
     >        
      <Camera
        onBarCodeScanned={scanned ? undefined : this.handleBarCodeScanned}
        style={{ flex:1}}
        barCodeScannerSettings={{
          barCodeTypes: [BarCodeScanner.Constants.BarCodeType.qr],
        }}
      />
    </View>
  );
}