본문 바로가기
Flutter/Widget

플러터에서 MediaQuery 완벽 가이드: 화면 크기와 비율 쉽게 관리하기

by Maccrey Coding 2024. 10. 16.
728x90
반응형

 

오늘은 많은 초보 플러터 개발자들이 헷갈려하는 MediaQuery에 대해 다뤄보려고 합니다.

MediaQuery는 플러터에서 화면의 크기나 비율을 동적으로 계산하여 UI를 조정하는 데 꼭 필요한 도구입니다.

다양한 디바이스에 적합한 레이아웃을 만들 때 자주 사용되죠.

이번 포스트에서는 MediaQuery의 기본 개념과 사용법, 주요 옵션들에 대해 초보자들도 쉽게 이해할 수 있도록 설명하겠습니다.

본론

MediaQuery란?

MediaQuery는 플러터에서 현재 디바이스 화면의 크기, 비율, 해상도, 방향 등과 같은 정보를 가져오는 도구입니다. 이를 사용하면 화면 크기와 비율에 맞게 동적으로 레이아웃을 조정할 수 있어, 다양한 디바이스에서 UI가 제대로 보이도록 만들 수 있습니다.

간단한 예로, 스마트폰과 태블릿은 화면 크기가 다르기 때문에 MediaQuery를 통해 각각의 기기에 맞는 레이아웃을 따로 설정할 수 있습니다. 그럼 이제 MediaQuery의 기본 사용법을 코드로 살펴볼까요?

기본 사용법

import 'package:flutter/material.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // MediaQuery로 화면 크기 정보 가져오기
    double screenWidth = MediaQuery.of(context).size.width;  // 화면 너비
    double screenHeight = MediaQuery.of(context).size.height;  // 화면 높이
    double screenAspectRatio = MediaQuery.of(context).size.aspectRatio;  // 화면 비율
    double screenPadding = MediaQuery.of(context).padding.top;  // 상태바 패딩
    
    return Scaffold(
      appBar: AppBar(
        title: Text('MediaQuery 사용 예제'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('화면 너비: $screenWidth'),  // 너비 출력
            Text('화면 높이: $screenHeight'),  // 높이 출력
            Text('화면 비율: $screenAspectRatio'),  // 비율 출력
            Text('상태바 패딩: $screenPadding'),  // 상태바 패딩 출력
          ],
        ),
      ),
    );
  }
}

코드 설명

  1. MediaQuery.of(context).size.width: 화면의 너비를 가져옵니다.
  2. MediaQuery.of(context).size.height: 화면의 높이를 가져옵니다.
  3. MediaQuery.of(context).size.aspectRatio: 화면의 가로 세로 비율을 가져옵니다.
  4. MediaQuery.of(context).padding.top: 상단 상태바나 노치 영역의 패딩 값을 가져옵니다.

이 코드에서는 화면의 크기와 비율을 MediaQuery로 가져와서 Text 위젯으로 화면에 출력하고 있습니다. 이를 통해 사용자가 어떤 기기를 사용하든 그 기기의 화면 크기에 따라 유동적인 UI를 만들 수 있습니다.

MediaQuery 주요 옵션 설명

  1. size: MediaQuery.of(context).size는 화면의 가로와 세로 크기를 가져오는 가장 기본적인 옵션입니다. 디바이스에 따라 UI가 자동으로 조정되게 하려면 이 값을 꼭 활용해야 합니다.
  2. padding: 상태바나 노치와 같은 안전 영역에 대한 패딩 값을 가져옵니다. 노치 디자인이 있는 스마트폰의 경우 이 값을 고려해 UI를 배치하는 것이 중요합니다.
  3. devicePixelRatio: 화면 해상도를 나타내는 값입니다. 예를 들어, 고해상도 디바이스에서는 UI가 더 세밀하게 표현되어야 하기 때문에 이 값을 활용해 적절한 이미지를 설정할 수 있습니다.
  4. orientation: MediaQuery.of(context).orientation을 사용하면 화면이 가로인지 세로인지 알 수 있습니다. 이를 통해 가로 모드와 세로 모드에서 다른 레이아웃을 제공할 수 있습니다.

MediaQuery를 활용한 실전 예제: 반응형 레이아웃 만들기

다양한 화면 크기에 맞게 반응형 UI를 만드는 것이 중요합니다. 아래 예제는 화면의 너비가 작은 기기와 큰 기기에 따라 다른 레이아웃을 제공하는 방법을 보여줍니다.

import 'package:flutter/material.dart';

class ResponsiveLayout extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    double screenWidth = MediaQuery.of(context).size.width;

    return Scaffold(
      appBar: AppBar(
        title: Text('반응형 레이아웃'),
      ),
      body: Center(
        child: screenWidth < 600
            ? Column(  // 화면 너비가 600 이하일 때 세로 레이아웃
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('작은 화면'),
                  Icon(Icons.phone_android, size: 100),
                ],
              )
            : Row(  // 화면 너비가 600 이상일 때 가로 레이아웃
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('큰 화면'),
                  Icon(Icons.desktop_windows, size: 100),
                ],
              ),
      ),
    );
  }
}

코드 설명

  1. screenWidth < 600: 화면의 너비가 600 이하일 때는 세로 레이아웃을, 그 이상일 때는 가로 레이아웃을 보여줍니다. 작은 스마트폰과 큰 태블릿에서 UI가 어떻게 다르게 보일지 설정하는 방법입니다.
  2. Column과 Row는 각각 세로와 가로로 위젯을 배치하는 레이아웃 컨테이너입니다.

이 예제를 통해 어떤 기기에서든 화면 크기에 맞춰 동적으로 반응하는 UI를 구현할 수 있습니다.

MediaQuery의 한계

MediaQuery는 매우 유용하지만, 모든 UI 문제를 해결할 수 있는 것은 아닙니다. 복잡한 레이아웃을 만들 때는 LayoutBuilderFlexible 같은 다른 위젯과 함께 사용하는 것이 더 효과적일 수 있습니다.

 

MediaQuery는 플러터에서 다양한 화면 크기와 비율에 맞게 동적인 레이아웃을 만들 때 매우 중요한 도구입니다.

이 가이드를 통해 초보자들도 쉽게 화면 크기에 맞는 UI를 구현할 수 있을 것입니다.

다양한 옵션을 활용해 여러 기기에서 반응형 UI를 만들어보세요!

 

구독!! 공감과 댓글,

광고 클릭은 저에게 큰 힘이 됩니다.

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

728x90
반응형