본문 바로가기

ANDROID/UI - UX

[안드로이드] SeekBar의 Thumb 색상 실시간 변화주기, BlendModeColorFilter 사용하기 (feat. ColorFilter deprecated)

금번에 SeekBar의 Thumb에 새로운 인터랙션을 주게 되면서 

 

기존에 적용해 둔 Listener에 ColorFilter를 먹이고자 했다.

 

하지만 ColorFilter를 먹이던 시절은 이미 오래 전이었고.. 현재는 deprecated 된 요소였던 것이다.

 

 

 

그러면 무엇을 써야하는 것인가? 검색을 통해 BlendModeColorFilter라는 클래스를 찾을 수 있었다.

 

 

BlendModeColorFilter  |  Android 개발자  |  Android Developers

BlendModeColorFilter public final class BlendModeColorFilter extends ColorFilter A color filter that can be used to tint the source pixels using a single color and a specific BlendMode. Summary Public methods boolean equals(Object object) Indicates whether

developer.android.com

이 클래스를 통해 기존 PorterduffMode에서 사용하던 파라미터들을 그대로 적용해 쓸 수 있었고,

 

결과적으로 progress 값에 따라 Thumb의 색상이 바뀌도록 할 수 있었다.

 

- seekbar의 참조는 binding 클래스를 통해 참조하였으며, 이는 findViewById 등으로도 대체가 가능하다.

var dynamicThumbColor: Int

val seekbarChangeListener = object: Seekbar.OnSeekBarChangeListener {
	override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
    
    // argb의 alpha의 경우 MAX 값이 255라는 걸 유념할 것.
    // MAX_RGB는 255로 지정해 progress 값에 따라 빨간색에서 파란색으로 색상이 변경되도록 하였음.
    // 별도의 매핑 연산을 넣지 않아 러프하게 색상이 들어갈 것임.
    dynamicThumbColor = Color.argb(255, MAX_RGB-progress, 0, progress)
    
    binding.balanceSeekbar.thumb.mutate().colorFilter = 
    BlendModeColorFilterCompat.createBlendModeColorFilterCompat(dynamicThumbColor,
    BlendModeCompat.SRC_ATOP)
    
    binding.balanceSeekbar.invalidate()
    
}
    	

 

 

https://stackoverflow.com/questions/56716093/setcolorfilter-is-deprecated-on-api29/56717316

 

setColorFilter is deprecated on API29

I use the following line to change the color of a VectorDrawable: mydrawable.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP) This works nice, though it is now deprecated. The

stackoverflow.com