안드로이드

OS 6이하에서 벡터 이미지 제대로 안나오는 문제

코딩하는후운 2023. 5. 11. 17:57
반응형

Android 6.0, Marshmallow 이하의 버전에서 아이콘이 깨지는 현상이 발생하였습니다.


Android 6.0 이하의 버전에서는 이미지를 추가할 때,
app:srcCompat을 사용해야 하는데 그렇지 않아서 아이콘이 깨지는 문제가 발생하였습니다.
그래서 android:src 대신 app:srcComapt을 사용하도록 변경했으며,

selector로 적용한 이미지들은 프로그래밍 방식으로 적용하여 해결했습니다.

원인 : fillType:"ovenOdd" 속성의 지원 가능 api level이 24 이상이기 때문에 23이하 기기에서 정상적인 이미지가 보이지 않음
- 회사분이 코멘트 주심!

어떤게 정확한 답변인지는 잘 모르겠음!
srcCompat으로 제대로 나오기도 하니깐.?

아무튼 프로그래밍 해결 방법

Extensions함수를 두개 만듬.(회사분이 잘 만들어주심!)

/**
 * 상태(state)에 따른 Drawable을 생성하고, selector를 구성하여 반환하는 함수
 *
 * @param ingredients selector에 필요한 재료
 * @return 상태에 따른 Drawable 목록 객체
 */
fun Resources.getStateListDrawable(vararg ingredients: Ingredient): StateListDrawable {
    val stateListDrawable = StateListDrawable()

    ingredients.forEach { ingredient ->
        stateListDrawable.addState(
            ingredient.stateSet,
            getDrawableWithTint(ingredient.drawableResId, ingredient.colorResId)
        )
    }

    return stateListDrawable
}

 

/**
 * Vector drawable resource id로 Drawable을 생성하고 Tint를 입혀서 반환하는 확장 함수
 *
 * @param drawableResId Vector drawable resource id
 * @param colorResId Tint color resource id
 * @return Tint를 입힌 (Vector) Drawable, 생성에 실패하면 null
 */
fun Resources.getDrawableWithTint(
    @DrawableRes drawableResId: Int,
    @ColorRes colorResId: Int = 0
): Drawable? {
    val drawable = (VectorDrawableCompat.create(this, drawableResId, null) as? Drawable)

    if (drawable != null) {
        DrawableCompat.wrap(drawable)
        DrawableCompat.setTint(
            drawable,
            ResourcesCompat.getColor(this, colorResId, null)
        )
    }

    return drawable
}

 

사용법 !

ivEventTerms.setImageDrawable(
    resources.getStateListDrawable(
        Ingredient(
            intArrayOf(android.R.attr.state_selected),
            R.drawable.이미지_select,
            R.color.color값
        ),
        Ingredient(
            intArrayOf(-android.R.attr.state_selected),
            R.drawable.이미지_normal,
            R.color.color값
        )
    ))
반응형