졸업프로젝트

[React Native] 3X3 FlatList 배열 만들기

valid_ming 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");
  }

}