반응형
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값
)
))
반응형
'안드로이드' 카테고리의 다른 글
Android equals와 equalsIgnoreCase 차이 (0) | 2023.06.12 |
---|---|
delay 혹은 애니메이션 후 이벤트 발생시 binding에러 (0) | 2023.05.19 |
Android 갤러리 contentResolver DATE_TAKEN 문제 (0) | 2023.05.10 |
안드로이드 에뮬레이터 먹통이 되었을 때 (0) | 2023.04.25 |
[Android] 푸시 원하는 화면이동 parentActivityName (0) | 2023.04.19 |