Photo by Mel Poole on Unsplash
안드로이드 개발을 하다가보면 하나의 다음과같은 요구사항이 생기는 상황이 생깁니다.
TextView
안에 2줄일 때는14sp
, 텍스트가 만약에 길어질 때는 3줄로 제한하면서12sp
로 변경
이런 요구사항을 어떻게 해결할 수 있을까요? 글자 수 초과 시 텍스트 사이즈를 변경하는 코드를 만들거나 Canvas를 이용해 글자의 범위가 넘어가면 측정하는 로직을 따로 작성할 수 있지만 단순한 동작을 위해 너무 많은 작업이나 코드를 생산하게 되는 일이 발생합니다.
다행히 안드로이드에서는 Android 8.0(API 26)이상을 사용한다면 TextView
에 해당 기능을 지원하고 있습니다. 그 이전 버전은 AppCompat
을 사용하여 다루어야하고 최소 버전은 4.0(API 14) 이상입니다.
그럼 실제로 어떠한 상황에서 쓰여야하는지 살펴보겠습니다.
위 사진은 29cm의 상품리스트 화면입니다. 상품의 설명으로 커피잔 세트... 으로 간단하게 설명이 되어 있지만 이 TextView
에 더 많은 텍스트를 넣기위해 3줄을 허용하게 변경하는 요구사항이 발생할 수 있습니다.
이 경우에 기존 2줄의 높이는 유지하면서 3줄의 조금 더 작은 텍스트사이즈의 설명이 들어가게 하려면 안드로이드에서 제공하는 자동 크기 조절기능을 이용해 해결할 수 있습니다.
TextView 자동 크기 조절은 크게 3가지로 나누어 작업할 수 있습니다.
⚠️ 텍스트 크기 조절 기능을 이용한다면 TextView의 width, height 속성을 wrap_content
로 지정해서는 안됩니다.
기본을 정의하는 방법은 간단합니다. xml에서 autoSizeTextType을 uniform으로 지정하거나 프로그래매틱 방법으로는 TextView
의 setAutoSizeTextTypeWithDefaults(int autoSizeTextType) 함수를 호출해서 적용할 수 있습니다.
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform" />
📘 기본값으로 적용되는 텍스트 사이즈는 최소(12sp), 최대(112sp), 단위(1px)로 지정됩니다.
세부사항을 정의하는 방법은 기본값을 지정하는 방법에 더해서 최소, 최대, 단위를 추가해 구성하는 방법입니다.
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="12sp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeStepGranularity="2sp" />
각 옵션들에 대한 설명
최소, 최대값등을 정의하지 않고도 텍스트 크기 조절을 지정한 사이즈 리스트에만 한정하는 방법이 있습니다.
<resources>
<array name="autosize_text_sizes">
<item>10sp</item>
<item>12sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
</resources>
텍스트 크기 변경의 범위를 배열의 형태로 지정합니다.
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizePresetSizes="@array/autosize_text_sizes" />
autoSizePresetSizes에 배열을 지정합니다.
아까의 요구사항을 위의 내용들을 이용해 적용해보겠습니다.
<TextView
android:id="@+id/content"
android:layout_width="0dp"
android:layout_height="64dp"
android:autoSizeTextType="uniform"
android:autoSizeMaxTextSize="16sp"
android:autoSizeMinTextSize="8sp"
android:autoSizeStepGranularity="1sp"
...
/>
UI에서 어색하지 않을 정도의 범주로 최대를 16sp, 최소를 8sp로 지정하고 최대한 영역을 활용할 수 있게 단계를 1sp로 지정했습니다.
적용전 | 적용후(최소) | 적용후(최대) |
이제 기존 높이에 변화없이 최소, 최대 값을 유지하면서 유연하게 텍스트를 표현할 수 있습니다.
긴 글 읽어주셔서 감사합니다. 🙇♂️
이런게 있는지 첨 알았네요 감사합니다!