I managed to solve the issue with a hack:
val overlay = IntroductoryOverlay.Builder(this@CastActivity, it)
.setTitleText(configHolder.tr("cast.message.overlay"))
.setOverlayColor(R.color.imageOverlayBackground)
.setSingleTime()
.build()
overlay.show()
// A hack to change colors. Note that the color of button itself is changed in the Styles
(overlay as? ViewGroup)?.apply {
// Title text color
findViewById<TextView>(R.id.cast_featurehighlight_help_text_header_view)?.setTextColor(configHolder.getColor(R.color.imageOverlayParagraphForeground, 0.9F))
// The highlight color surrounding the button
findViewById<View>(R.id.cast_featurehighlight_view).apply {
try {
val classFields = this::class.java.declaredFields
for (classField in classFields) {
// Getting class member that is InnerZoneDrawable
if (classField.type.toString().contains("InnerZoneDrawable", true)) {
classField.isAccessible = true
// Get an object of this class member, convert it to Drawable, and apply color filter
val innerZoneDrawable = classField.get(this)
(innerZoneDrawable as Drawable).apply {
colorFilter = PorterDuffColorFilter(configHolder.getColor(R.color.buttonPrimaryDefaultBackground), PorterDuff.Mode.SRC_IN)
}
// Now for the circle animator, we need to access Paint variables inside InnerZoneDrawable and apply color filter
val innerZoneClassFields = innerZoneDrawable.javaClass.declaredFields
for (innerZoneClassField in innerZoneClassFields) {
if (innerZoneClassField.type == Paint::class.java) {
innerZoneClassField.isAccessible = true
(innerZoneClassField.get(innerZoneDrawable) as Paint).apply {
colorFilter = PorterDuffColorFilter(configHolder.getColor(R.color.buttonPrimaryDefaultBackground), PorterDuff.Mode.SRC_IN)
}
}
}
}
}
} catch (e: Exception) {
Timber.w(e)
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…