React Native view не имеет 100% ширины

#node.js #reactjs #react-native #view #expo

#node.js #reactjs #react-native #Вид #выставка

Вопрос:

Я перепробовал почти все, что мог, почему BarCodeScanner вид не имеет полной ширины? Он имеет отступ размером 15-20 пикселей слева и справа, поэтому по бокам от него есть белые вертикальные полосы. Я тестирую это на реальном устройстве с Android 8

 import * as React from 'react';
import { Text, SafeAreaView, View, StyleSheet, Button, Dimensions } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { BarCodeScanner } from 'expo-barcode-scanner';

const Stack = createStackNavigator();

class BarcodeScannerExample extends React.Component {

  render() {
    return (
      <SafeAreaView
          style={{
            flex: 1,
            flexDirection: 'column',
            justifyContent: 'flex-end',
          }}>
          <BarCodeScanner
            onBarCodeScanned={scanned ? undefined : this.handleBarCodeScanned}
            style={[StyleSheet.absoluteFillObject, styles.container]}>
          </BarCodeScanner>
      </SafeAreaView>
    );
  }
}

const { width } = Dimensions.get('window');
const qrSize = width * 0.9;
const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    width: width,
    padding: 0,
    margin: 0,
  },
});

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component={BarcodeScannerExample} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;
 

Ответ №1:

Похоже BarCodeScanner , что камера всегда сохраняет свое соотношение сторон (высота / ширина). Экран вашего телефона (безопасная область) имеет несколько иное соотношение сторон, и поэтому камера не подходит идеально.

Вы можете удалить absoluteFillObject from style , чтобы исправить это.

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

1. не работает, уже пробовал, но я ценю вашу помощь

Ответ №2:

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

 import { Camera } from 'expo-camera';

 <Camera
                    onBarCodeScanned={canScan ? handleBarCodeScanned : undefined}
                    style={[{
                        width: Dimensions.get('screen').width,
                        height: Dimensions.get('screen').height
                    }, StyleSheet.absoluteFill]} >
 

Ответ №3:

Я бы предпочел предложить вам использовать Camera компонент, BarCodeScanner в некоторых случаях имеет некоторые проблемы, занимающие 100% ширины и / или высоты.

Установите Camera компонент с помощью

 expo install expo-camera
 

или

 npm install expo-camera
 

Использование:

 <Camera
                   onBarCodeScanned={scanned ? handleBarCodeScanned : undefined}
                   style={[{
                       width: Dimensions.get('screen').width,
                       height: Dimensions.get('screen').height
                   }, StyleSheet.absoluteFillObject]} >
 

Вы можете дополнительно усовершенствовать пользовательский интерфейс, создав прозрачную центральную область для сканирования с полупрозрачными или затемненными краями.
Например:

 <Camera
                    onBarCodeScanned={scanned ? handleBarCodeScanned : undefined}
                    style={[{
                        width: Dimensions.get('screen').width,
                        height: Dimensions.get('screen').height
                    }, StyleSheet.absoluteFillObject]} >
        <View style={styles.layerTop} />
        <View style={styles.layerCenter}>
          <View style={styles.layerLeft} />
          <View style={styles.focused} />
          <View style={styles.layerRight} />
        </View>
        <View style={styles.layerBottom} />
</Camera>
 
 const opacity = 'rgba(0, 0, 0, .6)';
const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    
  },
  layerTop: {
    flex: 2,
    backgroundColor: opacity
  },
  layerCenter: {
    flex: 3,
    flexDirection: 'row'
  },
  layerLeft: {
    flex: 1,
    backgroundColor: opacity
  },
  focused: {
    flex: 6,
    
  },
  layerRight: {
    flex: 1,
    backgroundColor: opacity
  },
  layerBottom: {
    flex: 4,
    backgroundColor: opacity
  },
});
 

Вы можете настроить гибкие значения различных атрибутов стиля (например: layerTop, layerLeft и так далее), Чтобы переместить прозрачный вид вокруг центра.