使用这个有用的扩展
fun Context.makeCircleRippleDrawable(
@ColorInt rippleColor: Int = ContextCompat.getColor(this, R.color.black_alpha_25),
@ColorInt backgroundColor: Int = ContextCompat.getColor(this, android.R.color.transparent),
@ColorInt disabledColor: Int = backgroundColor,
elevation: Float = 0F
): Drawable {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val content: GradientDrawable?
val mask: GradientDrawable?
if (backgroundColor == Color.TRANSPARENT) {
content = null
mask = GradientDrawable()
mask.setColor(rippleColor)
mask.shape = GradientDrawable.OVAL
} else {
content = GradientDrawable().also {
it.shape = GradientDrawable.OVAL
it.color = ColorStateList(
arrayOf(
intArrayOf(android.R.attr.state_activated),
intArrayOf(android.R.attr.state_enabled),
intArrayOf(-android.R.attr.state_enabled)
),
intArrayOf(
backgroundColor,
backgroundColor,
disabledColor
)
)
}
mask = null
}
RippleDrawable(
ColorStateList(
arrayOf(
intArrayOf(android.R.attr.state_pressed),
intArrayOf(android.R.attr.state_focused),
intArrayOf(android.R.attr.state_activated)
),
intArrayOf(
rippleColor,
rippleColor,
rippleColor
)
),
content,
mask
)
} else {
val shapePressed = GradientDrawable()
shapePressed.shape = GradientDrawable.OVAL
shapePressed.setColor(rippleColor)
val shapeDefault = GradientDrawable().also {
it.shape = GradientDrawable.OVAL
it.color = ColorStateList(
arrayOf(
intArrayOf(android.R.attr.state_activated),
intArrayOf(android.R.attr.state_enabled),
intArrayOf(-android.R.attr.state_enabled)
),
intArrayOf(
backgroundColor,
backgroundColor,
disabledColor
)
)
}
val stateListDrawable = StateListDrawable()
stateListDrawable.addState(
intArrayOf(
android.R.attr.state_pressed,
android.R.attr.state_enabled
), shapePressed
)
stateListDrawable.addState(intArrayOf(), shapeDefault)
stateListDrawable
}
}