-
[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"); } }
'졸업프로젝트' 카테고리의 다른 글
프로젝트 주제 변경 (화상회의 플랫폼 개발) (0) 2021.01.11 [Expo] Android apk 파일 빌드하기 (0) 2020.12.10 [React Native] 탭 구현하기 (0) 2020.12.02 [React Native] 협업하기 (git 충돌 해결) (0) 2020.12.02 [React Native] 버튼 눌러 페이지 이동하기 (0) 2020.11.28