问题描述
根据 documentation,Cast Introductory 叠加层可通过样式自定义。
<item name="castIntroOverlayStyle">@style/CustomCastIntroOverlay</item>
<style name="CustomCastIntroOverlay" parent="CastIntroOverlay">
<item name="castButtonTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Button</item>
<item name="castTitleTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Title</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Button" parent="android:style/TextAppearance">
<item name="android:textColor">#FFFFFF</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Title"parent="android:style/TextAppearance.Large">
<item name="android:textColor">#FFFFFF</item>
</style>
但是,无论您在样式中使用什么颜色,TitleText 和 Cast Button 覆盖颜色(按钮周围的颜色)都不会改变。
这也可以在 sample code 中重现。
我有reported the bug in the repo
解决方法
我设法通过 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)
}
}
}