본문 바로가기

AppDev/Android

[ Android ] 기종 별 사이즈 대응

안드로이드는 수많은 기종이 있고 기종마다 지원되는 해상도가 다르다.

예를들어 Pixel 폰 해상도에서 marginTop 을 250dp 주었을때는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="250dp"
        android:layout_centerHorizontal="true"
        android:src="@android:drawable/sym_def_app_icon"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
    />

</RelativeLayout>

activity_main.xml

좌 : Pixel, 우 : Nexus S

android:layout_marginTop="250dp"


똑같이 marginTop을 "250dp" 주었지만 Pixcel 폰은 가운데에 위치한 반면 Nexus S 폰은 상대적으로 아래 위치하고 있다.

따라서 기종마다 사용자가 느끼는 경험이 달라지고 기종에 따라 UI가 짤리는 현상도 일어난다.

 

이러한 기종별 사이즈를 대응하는 방법 중 dimens를 활용하는 방법이 있다.

안드로이드의 리소스 폴더에 values-h720dp 를 생성한다.
해당 리소스 폴더에 들어가는 리소스 파일은 높이가 720dp 이상의 화면이 적용 대상이 된다.

해당 폴더 내에 dimens.xml을 아래와 같이 생성한다.

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">

    <dimen name="margin_top_iv_main">250dp</dimen>

</resources>

dimens.xml

안드로이드의 리소스 폴더에 values 폴더를 생성한 후(존재하지 않을 경우) 해당 폴더 내에도 dimens.xml을 아래와 같이 생성한다.

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">

    <dimen name="margin_top_iv_main">200dp</dimen>

</resources>

dimens.xml

 

이 후 activity_main의 margin 값을 아래와 같이 변경한다.

android:layout_marginTop="@dimen/margin_top_iv_main"

 

위와 같이 변경할 경우 720dp 이상의 화면(pixel)은 250dp가 미만의 화면은 200dp가 적용되게 된다.

좌 : Pixel, 우 : Nexus S


개발자에 따라 다르겠지만 내가 사용하는 dimens는 다음과 같이 위치하고 있다.

values-h720dp → dimens.xml :
- 세로 기준 720dp 이상의 화면이 기준이 된다. 스크롤을 지원하지 않는 화면 사이즈 대응을 처리한다.

values-h640dp → dimens.xml :
- 세로 기준 640dp 이상의 화면이 기준이 된다. 스크롤을 지원하지 않는 화면 사이즈 대응을 처리한다.

values-h560dp → dimens.xml :
- 세로 기준 560dp 이상의 화면이 기준이 된다. 스크롤을 지원하지 않는 화면 사이즈 대응을 처리한다.

values-h480dp → dimens.xml :
- 세로 기준 480dp 이상의 화면이 기준이 된다. 스크롤을 지원하지 않는 화면 사이즈 대응을 처리한다.

values-w640dp → dimens.xml :
- 가로 기준 640dp 이상의 화면이 기준이 된다. 폰트로 인한 사이즈 대응을 처리한다.

values-w480dp → dimens.xml :
- 가로 기준 480dp 이상의 화면이 기준이 된다. 폰트로 인한 사이즈 대응을 처리한다.
values-w320dp → dimens.xml :
- 가로 기준 320dp 이상의 화면이 기준이 된다. 폰트로 인한 사이즈 대응을 처리한다.


values → dimens.xml : 기기의 사이즈와 관계 없이 고정된 사이즈의 값을 처리한다.