Как разместить осязаемые значки в приложении с помощью react native

#javascript #android #react-native

Вопрос:

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

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

вот мой код:

 import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View,SafeAreaView, Image, Button,TouchableOpacity} from 'react-native';

export default function App() {
  return (
    
    <SafeAreaView style={styles.container}>
      
      {/*blue part on top*/}
      <SafeAreaView style={styles.toppading}/>
      

      <Text style={styles.title}>I.A</Text>

      <TouchableOpacity style={styles.student_image}>
        < Image style={styles.student_image} source={require('./assets/student.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.friends_image}>
        < Image style={styles.friends_image} source={require('./assets/friends.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.message_image}>
        < Image style={styles.message_image} source={require('./assets/chat.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.setting_image}>
        < Image style={styles.setting_image} source={require('./assets/settings.png')}/>
      </TouchableOpacity>

      {/*blue part on bottom*/}
      <SafeAreaView style={styles.downpading}/>

      <TouchableOpacity style={styles.map_image}>
        < Image style={styles.map_image} source={require('./assets/map.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.event_image}>
        < Image style={styles.event_image} source={require('./assets/event.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.home_image}>
        < Image style={styles.home_image} source={require('./assets/home.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.help_image}>
        < Image style={styles.help_image} source={require('./assets/help.png')}/>
      </TouchableOpacity>

      <TouchableOpacity style={styles.question_image}>
        < Image style={styles.question_image} source={require('./assets/question.png')}/>
      </TouchableOpacity>
    </SafeAreaView>
  );
}


const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white',
  },
  
  toppading: {
    height: 80,
    width: 400,
    backgroundColor: '#8CAFC0',
    position: 'absolute', 
    
  },

  downpading: {
    height: 80,
    width: 400,
    backgroundColor: '#8CAFC0',
    position: 'absolute', 
    bottom:0
    
  },
  title:{
    fontSize:24,
    fontWeight:'bold',
    textAlign:'center',
    top:30
  },
  student_image:{
    position:'absolute',
    width:40,
    height:40,
    top:13,
    left:"3%"
  },

  friends_image:{
    position:'absolute',
    width:40,
    height:40,
    top:13,
    left:'55%'

  },
  message_image:{
    position:'absolute',
    width:40,
    height:40,
    top:13,
    left:'65%'
  },

  setting_image:{
    position:'absolute',
    width:40,
    height:40,
    top:13,
    left:'75%'
  },

  map_image:{
    position:'absolute',
    width:40,
    height:40,
    bottom:10
  },

  event_image:{
    position:'absolute',
    width:40,
    height:40,
    bottom:10,
    left:'20%'
  },

  home_image:{
    position:'absolute',
    width:40,
    height:40,
    bottom:10,
    left:'40%'
  },

  help_image:{
    position:'absolute',
    width:40,
    height:40,
    bottom:10,
    left:'60%'
  },

  question_image:{
    position:'absolute',
    width:40,
    height:40,
    bottom:10,
    left:'80%'
  },

});
 

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

Ответ №1:

Я думаю , что лучший способ разместить ваши значки в соответствии с этим макетом-это использовать flexbox , как показано ниже:

 import React from "react";
import { StyleSheet, View } from "react-native";

function App() {
  return (
    <View style={styles.container}>
      <View style={styles.header}>
        <View style={styles.headerIconView}>
          <View style={styles.icon} />
        </View>

        <View style={styles.headerRowView}>
          <View style={styles.icon} />
          <View style={styles.icon} />
          <View style={styles.icon} />
          <View style={styles.icon} />
        </View>
      </View>

      <View style={styles.footer}>
        <View style={styles.icon} />
        <View style={styles.icon} />
        <View style={styles.icon} />
        <View style={styles.icon} />
        <View style={styles.icon} />
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "space-between"
  },
  header: {
    height: 80,
    width: "100%",
    backgroundColor: "#8CAFC0",
    flexDirection: "row",
    justifyContent: "space-around",
    alignItems: "center",
    paddingHorizontal: 10
    // position: 'absolute',
  },
  headerIconView: {
    flex: 1
  },
  headerRowView: {
    flexDirection: "row",
    flex: 2,
    justifyContent: "space-around"
  },
  footer: {
    height: 80,
    width: "100%",
    backgroundColor: "#8CAFC0",
    flexDirection: "row",
    justifyContent: "space-around",
    alignItems: "center",
    paddingHorizontal: 10
    // position: 'absolute',
    // bottom:0
  },
  icon: {
    width: 40,
    height: 40,
    backgroundColor: "gray"
  }
});

export default App;
 

Заметили, что вам даже не понадобится исправление position при использовании flexbox ?

Вот результат:

Экран с использованием flexbox

Если вам нужна помощь flexbox , вот песочница для кода, а также, возможно, вы захотите прочитать некоторые материалы из документов RN Flexbox.