创建启用/禁用效果的最佳方法之一是通过覆盖MaterialButton类并在其上应用ColorMatrix
import android.content.Context
import android.graphics.Canvas
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint
import android.util.AttributeSet
import com.google.android.material.button.MaterialButton
class MaterialButtonCustom @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
): MaterialButton(context,attrs,defStyleAttr) {
var disabled = false
set(value) {
field = value
requestLayout()
}
private val paint = Paint()
init {
val cm = ColorMatrix()
cm.set(
floatArrayOf(
0.6f, 0.6f, 0.6f, 0f, 0f,
0.6f, 0.6f, 0.6f, 0f, 0f,
0.6f, 0.6f, 0.6f, 0f, 0f,
0f, 0f, 0f, 1f, 0f
)
)
paint.colorFilter = ColorMatrixColorFilter(cm)
}
override fun dispatchDraw(canvas: Canvas?) {
if (disabled) {
canvas?.saveLayer(null, paint)
}
super.dispatchDraw(canvas)
if (disabled) {
canvas?.restore()
}
}
override fun draw(canvas: Canvas?) {
if (disabled) {
canvas?.saveLayer(null, paint)
}
super.draw(canvas)
if (disabled) {
canvas?.restore()
}
}
}
并且在Activity内部
class MainActivity : AppCompatActivity() {
lateinit var btn_plus:MaterialButtonCustom
var isActive: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_plus = findViewById(R.id.btn_plus)
setBtnEnabled()
btn_plus.setOnClickListener {
isActive = !isActive
if(isActive){
setBtnDisabled()
}else{
setBtnEnabled()
}
}
}
private fun setBtnDisabled() {
btn_plus.disabled = true
}
private fun setBtnEnabled() {
btn_plus.disabled = false
}
}
parent="ThemeOverlay.Material3.Button"
,以保持按钮功能(如涟漪效果)正常工作。 - Panos Gr