Kotlin:如何切换Button内背景图片的色调(灰度与原色来回切换)
你原来用backgroundTintList的方法无法实现预期效果,是因为tint通过颜色叠加处理背景,没法精准实现灰度转换。正确的做法是给Button的背景Drawable设置灰度颜色滤镜,点击时切换滤镜的开启/关闭状态。
实现步骤:
- 在Activity中初始化保存Button的背景Drawable(调用
mutate()避免影响其他复用该Drawable的控件),同时定义灰度滤镜:
private var cameraButtonDrawable: Drawable? = null private val grayFilter = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f) // 饱和度设为0即可实现灰度效果 }) var changeColor = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 初始化保存Button的背景Drawable,必须调用mutate() cameraButtonDrawable = binding.cameraButton.background.mutate() }
- 修改点击事件方法,切换滤镜状态:
fun cameraButtonTapped() { changeColor = !changeColor cameraButtonDrawable?.let { drawable -> if (changeColor) { drawable.colorFilter = grayFilter } else { drawable.colorFilter = null // 清除滤镜,恢复图片原色 } // 通知Drawable更新显示 binding.cameraButton.background = drawable } }
补充说明:
- 使用
ColorMatrix.setSaturation(0f)是实现灰度最简洁的方式,比手动编写灰度矩阵更直观易维护。 - 调用
mutate()非常关键:默认情况下同一个Drawable资源会被多个控件共享,修改滤镜会影响所有使用该资源的控件,mutate()会创建独立的Drawable副本,避免出现全局影响的问题。 - 你的XML代码无需修改,保持原有配置即可。
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

