微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

样式不会更改 Cast Introductory Overlay 中的标题文本和按钮高亮动画颜色

如何解决样式不会更改 Cast Introductory Overlay 中的标题文本和按钮高亮动画颜色

根据 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)
                        }
                    }
                }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。