android 가변폰트 적용

김토끼·2022년 12월 15일
0

가변폰트를 적용하기 위해 android support-v4 v26 이상이 필요하다.

support 라이브러리는 v28에서 지원이 끝났으므로 androidx.appCompat 라이브러리로 대체하자.

build.gradle [app]

// kotlin-dsl
dependencies {
  ...
//  implementation("com.android.support:support-v4:26.0.0") // appCompat으로 대체
  implementation("androidx.appcompat:appcompat:1.5.1")
  ...
}

1. res에 font 폴더 생성

2. res/font에 사용할 폰트 파일 추가 (가변폰트)

3. font resource xml 생성

파일 이름은 resource 규칙을 따라간다 (소문자 + '_'만 가능)

4. xml에 2에서 추가한 폰트 적용

xml 최상위 태그에 app 네임스페이스를 추가하고
android:font="@font/pretendard" 대신 app:font="@font/pretendard"을 사용

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        app:font="@font/pretendard"
        app:fontStyle="normal" />
</font-family>
  1. 4에 "fontVariationSettings"옵션 추가
    app:fontVariationSettings="'wght' [font_weight값]"
  • 폰트를 xml에서 지원하기 시작한건 android 26 버전부터고 fontVariationSettings은 android 28부터 지원하므로 그 이하 버전 지원을 위해 AppCompat 사용하자.
  • build.gradle에 compileSdkVersion도 28 이상으로 설정해야 한다.

설정할 수 있는 값은 weight(wght), width(wdth), italic(ital), slant(slnt), optical size(opsz), grade(GRAD)가 있으며 가변 폰트여도 해당 축 설정을 지원하지 않는 경우도 있다.

각 설정축에 대한 자세한 설명은 아래 참조
https://wit.nts-corp.com/2019/10/07/5686

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        app:font="@font/pretendard"
        app:fontStyle="normal"
        app:fontVariationSettings="'wght' 500" />
</font-family>
  1. style.xml 이든 theme.xml 이든 android:fontFamily든 원하는 곳에 5에서 만든 폰트(xml) 사용

※ 23.2.22 추가
가변폰트는 android N 이하에서는 일부 기능이 제대로 동작하지 않는다.
android N 기기에서 다음과 같은 에러가 발생했다.

Fatal Exception: android.res.Resource$NotFoundException

발생 위치를 확인해 보았더니 xml 말고 코드상에서 수동으로 폰트를 적용하는 부분에서 리소스를 찾지 못해 발생한 에러였다.

fun TextView.setBoldText(bold: Boolean) {
	(if (bold) R.font.pretendard_700 else R.font.pretendard_400)
    	.let { this.setTypeface(ResourceCompat.getFont(contet, it), Typeface.NORMAL)
}

이 부분은 버전 분기 처리를 통해 android O 이상이면 위 코드를 적용하고 미만이라면 Typeface.BOLD를 적용하는 방식으로 처리했다.

profile
방구석 김토끼🐰

0개의 댓글