본문 바로가기

안드로이드/팁

[AOS] 테마 적용하기 하는 방법 2가지

반응형

제가 현재 운영중인 '톡썰만들기'에는 테마 색상을 변경하면 주요 화면의 아이콘등의 배경색들이 변경됩니다.

테마 기능을 많은 유저분들이 원하셨지만 망설였던 이유가 색깔별로 아이콘 리소스를 생성해서 바꿔주는거 말곤 방법이 떠오르지 않았기 때문입니다. 

혼자서 다 진행하다보니 현생도 있고..가정도 있고 쉽지 않았는데 괜찮은 방법을 찾아서 공유드립니다. 사실상 2가지 방법이지만 첫번째는 비효율적인 방법입니다. 

 

| 테마별 리소스 생성 및 대체 ( 안좋은 사례 )

앞으로도 추가될수 있는 테마들을 어떻게 하면 보다 짧은 코드로 적용할 수 있을지 고민하다 찾은 방법이 리소스명에 테마 인덱스 숫자를 붙여서 적용하는 방법입니다.

            binding.ivChattingRealLike.setImageResource(
                getIdentifier(
                    "drawable/like_theme${themeIndex + 1}",
                    null,
                    packageName
                )
            )

 

테마를 적용할 뷰에따라 코드가 증가했고, 색상에 따라 리소스도 계속 생성해야해서 엄청 힘들었습니다.

그러다 발견한게 색상 코드 자체를 이미지에 덮어 씌우는 방법입니다.

 

| 테마별 색상코드로 덮어씌기

아이콘을 한벌만 생성하여 특정 색상 코드로 덮어씌어진 Drawable로 변경시키는 방법입니다.

    fun convertChangeColorDrawable(resourceId: Int, index: Int): Drawable? {
        val unwrappedDrawable = AppCompatResources.getDrawable(this, resourceId)
        val wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable!!)
        DrawableCompat.setTint(
            wrappedDrawable,
            ContextCompat.getColor(this, Common.chattingColors[index])
        )
        return wrappedDrawable
    }

	.....

    binding.ivBack.setImageDrawable(
         convertChangeColorDrawable(
             R.drawable.left_arrow,
             themeIndex
            )
         )

코드가 더 간결해지진 않았지만 리소스를 하나씩 추가할일은 없어졌습니다. 

 

혹시나 앱내 테마 기능을 적용하실 예정이거나 다크모드 지원하실 예정이라면 한번 적용해보시면 좋을것 같습니다!

 

 

 

반응형