Kotlin

[Kotlin] 동적 생성한 View textSize SP 로 설정하기

eulBlue 2023. 10. 24. 12:32

📱테스트 환경

Samsung Galaxy Android 13 • Android 10


😢 내가 겪은 문제

val button = Button(this).apply {
    text = getCategoryName(category)
    textSize =15f
    setTextColor(Color.parseColor("#000000"))
    layoutParams = LinearLayoutCompat.LayoutParams(
        getWidthBasedOnTextLength(text.toString()),
        dpToPx(33)
    ).also {
        it.leftMargin = 25
        if(unreadMessage == 0) {
            it.rightMargin = 25
        }
    }
    setPadding(dpToPx(5), 0, dpToPx(5), 0)
    setBackgroundColor(Color.TRANSPARENT)
    setOnClickListener {
        switchCategory(index, category)
    }
}

대충 이런식으로 동적으로 Button 을 만들고있었다. textSize 를 15f 로 설정하고 테스트를 해보는데, 아 ~ 무 문제가 없었다.

그렇게 행복한 나날을 보내던 도중에 문제가 발생했는데 .. 요즘 최신 핸드폰인 Z 플립 5 에서는 텍스트가 너무 커서 짤려보이는 문제가

발생하고야 만것이다 .. 코틀린을 대충 배울때만 해도 이게 뷰에 따라서 알아서 조절된다고 들었는데 .. 뭐가 문제였을까ㅠ

sp와 dp는 안드로이드에서 사용되는 상대적인 단위이다.

sp (scale-independent pixels) : 텍스트 크기를 위한 단위로, 사용자의 폰트 설정과 화면 밀도에 따라 조절된다. 주로 텍스트 크기에 사용.

dp (density-independent pixels) : 화면 밀도에 따라 조절되는 단위이다. 물리적인 크기가 거의 동일하게 유지되도록 설계.

15f와 같은 방식으로 텍스트 크기를 설정하면, 그 값은 px (픽셀)로 해석됩니다.
픽셀은 상대적인 단위가 아니므로 화면 밀도나 폰트 크기 설정에 따라 조절되지 않습니다.

키야 ... 그렇다 .. 나는 픽셀로 고정을 시켜놔서 그냥 지금 내화면에서만 안깨지는거지 언제 어디서 깨질지 모르는 상황이였던 것이다 ..

그럼 픽셀로 하면 안되고, 텍스트니까 sp 로 설정을 해줘야하는데 어떻게하는지는 생각보다 간단해서 바로 퍼왔다.

setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f)

이렇게 하면 sp 로 설정해서 화면 크기별로 적당하게 알아서 조정이 될 것이다.

근데 이것보다 더 확실한 방법이 있는데 dimen 을 설정해서 사용하는 것이다.

dimen 설정하는 방법은 이분꺼를 참고했는데 진짜 설명도 잘돼어있고 친절하고 완벽하다.

 

안드로이드 스튜디오 해상도별 화면 틀어짐 대응해보기(dimen)

------------------------------------------------------------------------------------- 2023.04.26 ConstraintLayout를 사용하시면 대부분의 해상도 틀어짐은 잡을 수 있습니다. 혹시라도 ConstraintLayout의 기능을 모르시는 분들

onedaycodeing.tistory.com

보시는 분들도 많아서 그런지 내가 궁금한것도 댓글에 다 적혀있다. 이래서 사람들이 많이 보나보다.

 resources.getDimension(R.dimen.categoryListButtonTextSize) / resources.displayMetrics.scaledDensity
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="categoryListButtonTextSize">12sp</dimen>
</resources>

이런식으로 화면 크기별로 설정해주면 알아서 디스플레이에 따라서 조절할 수 있다.

화면 해상도에 따른 dpi 값은 다음과 같다.

mdpi (medium) ~160dpi

hdpi (high) ~240dpi

xhdpi (extra-high) ~320dpi

xxhdpi (extra-extra-high) ~480dpi

xxxhdpi (extra-extra-extra-high) ~640dpi

그럼 이제 요즘 사용하는 폰의 dpi 값은 어디서 확인하냐 하면 우리에겐 아주 훌륭한 나무위키가 있다.

 

갤럭시 Z 플립5 - 나무위키

나이토그래피(Nightography)는 저조도 환경에서의 사진 품질 개선을 위한 소프트웨어 기술이다. 사진 촬영 시, 멀티프레임 프로세싱을 통해 연속으로 이미지를 촬영하여 문제가 발생한 사진을 제외

namu.wiki

가서 이제 궁금한 핸드폰 기종을 검색해서 ppi 를 확인해보면 된다.