ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React Native] 3X3 FlatList 배열 만들기
    졸업프로젝트 2020. 12. 2. 11:16

     

    메인 화면에서 다운로드한 책을 3x3 열로 보여주기 위해 react-native-grid-layout을 이용하고자 했으나

    번들 오류로 인해 react-native에 포함되어 있는 FlatList로 grid layout을 구현하였다.

    여기를 참고하여 코드를 작성하였습니다.

     

     

    1. 배경화면 넣기

     

    ImageBackground를 이용합니다.

    Image와 다르게 child를 가질 수 있어 child로 다른 components를 포함할 수 있습니다.

     

    1.1 local file 이미지 경로에 추가하기

    <ImageBackground source={require('./assets/background_image.jpg')}  style={styles.backgroundImage}>

    source={require('local_file_경로')}와 같이 사용합니다.

     

    1.2 이미지 크기 늘리기

    배경화면으로 이미지를 사용하기 위해

    width와 height의 범위를 100%로 합니다.

     

    1.2.1 이미지 크기에 맞게 늘리기

    이미지를 확대하다보면 가로나 세로가 잘리는 경우가 있는데 resizeMode 속성을 이용하면 됩니다.

    - resizeMode: 'contain'

    가로 세로 중 넓은 부분이 100%를 차지할 때 까지만 이미지를 늘리는 것입니다.

    본 이미지의 전체를 보여줄 때 사용합니다.

     

    - resizeMode: 'cover'

    이미지의 가로 세로 중 좁은 부분이 부모 컴포넌트의 100%를 차지할 때까지 이미지를 늘리는 것입니다.

    이미지는 잘리지만 부모 컴포넌트를 가득 채우고 싶을 때 사용합니다.

     

    [참고: 여기]

     

     

    2. FlatList 배열 만들기

     

    2.1 FlatList data에 넣을 bookArr 배열을 만듭니다.

    저 같은 경우는 json 타입으로 idx와 이미지 경로를 가진 데이터 배열을 선언해 주었습니다.

     {
        idx:"1",
        src:require("./assets/book1.png"),
      },

     

    2.2 renderItem

    bookArr의 한 원소가 Item이 되고 한 item을 어떻게 처리할지 코드를 짭니다.

    터치 가능하게 + 행으로 추가 + 이미지 출력

    renderItem={({item}) => (
                    <TouchableOpacity>
                    <View
                      style={{
                        flex:1,
                        flexDirection:'column',
                        margin:10
                      }}>
                        <Image
                          style={styles.imageThumbnail}
                          source={item.src}
                        />
                      </View>
                      </TouchableOpacity>
                  )}

     

    2.3 한 colunm을 이루는 원소의 개수를 정해줍니다.

                  numColumns={3}

     

     

    3. 실행 화면

     

     

    4. 전체 코드

     

    import React, { Component } from 'react';
    import {StyleSheet,View, Image,ImageBackground, FlatList} from 'react-native';
    import {TouchableOpacity} from 'react-native-gesture-handler';
    
    var styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
        flexDirection: 'column',
      },
      backgroundImage:{
        width: "100%",
        height:"100%",
      },
      boardImage:{
        marginTop:"10%",
        marginLeft:"5%",
        width:"95%",
        height:"95%",
      },
      imageThumbnail: {
        justifyContent: 'center',
        alignItems: 'center',
        resizeMode:'contain',
        width:190,
        height:250,
      },
      bookContainer: {
        marginHorizontal:"8%",
        marginVertical:"10%",
      },
    });
    
    const bookArr=[
      {
        idx:"1",
        src:require("./assets/book1.png"),
      },
      {
        idx:"2",
        src:require("./assets/book2.jpg"),
      },
      {
        idx:"3",
        src:require("./assets/book3.jpg"),
      },
      {
        idx:"4",
        src:require("./assets/book4.jpg"),
      },
      {
        idx:"5",
        src:require("./assets/book5.jpg"),
      },
      {
        idx:"6",
        src:require("./assets/book6.jpg"),
      },
      {
        idx:"7",
        src:require("./assets/book7.jpg"),
      },
    ];
    
    export default class Mainpage extends Component {
      render() {
        return (
          <View style={styles.container}>
            <ImageBackground source={require('./assets/background_image.jpg')}  style={styles.backgroundImage}>
              <ImageBackground source={require('./assets/greenboard.png')} style={styles.boardImage}>
                <FlatList
                  keyExtractor={item => item.idx}
                  data={bookArr}
                  style={styles.bookContainer}
                  renderItem={({item}) => (
                    <TouchableOpacity>
                    <View
                      style={{
                        flex:1,
                        flexDirection:'column',
                        margin:10
                      }}>
                        <Image
                          style={styles.imageThumbnail}
                          source={item.src}
                        />
                      </View>
                      </TouchableOpacity>
                  )}
                  numColumns={3}
                />
              </ImageBackground>
            </ImageBackground>
          </View>
        );
      }
     
      goSub1Screen(){
        this.props.navigation.navigate('Mypage');
        
        console.log("pressed");
      }
    
    }
    
    

    댓글

Designed by Tistory.