0

我试图找到一些如何做到这一点的信息,但到目前为止对我没有任何帮助。

当我尝试这样做时: new ShowcaseView.Builder(getActivity(), true)

外 2 个发光的圆圈消失了,其他两个圆圈失去了颜色。只有按钮仍然具有正确的颜色。

维度.xml

<dimen name="showcase_radius">40dp</dimen>
<dimen name="showcase_radius_inner">44dp</dimen>
<dimen name="showcase_radius_outer">48dp</dimen>

样式.xml

<style name="CustomShowcaseTheme">
        <item name="sv_backgroundColor">#CC000000</item>
        <item name="sv_buttonText">Close</item>
        <item name="sv_tintButtonColor">true</item>
        <item name="sv_titleTextAppearance">@style/CustomTitle</item>
        <item name="sv_detailTextAppearance">@style/TextAppearance.ShowcaseView.Detail</item>
</style>

<style name="CustomTitle" parent="TextAppearance.ShowcaseView.Title">
        <item name="android:textColor">#ffffff</item>
</style>

<style name="TextAppearance.ShowcaseView.Detail" parent="android:style/TextAppearance">
        <item name="android:textColor">#FFFFFF</item>
</style>

示例 - 如您所见,没有默认颜色,外圈消失了:

在此处输入图像描述

使用相同的设置但使用新的 ShowcaseView.Builder(getActivity()) 内部圈会变小,但其他圈不会跟随它,但它们会保持在原来的位置。 在此处输入图像描述

是否有任何解决方案可以使它们都变小但看起来与默认圆圈完全相同?

4

2 回答 2

1

我遇到了同样的问题,我发现了一个对我有用的“解决方案”,但可能不是正确的方法。对作者来说有点晚了,但也许它仍然可以对其他人有所帮助。

  1. 那个发光的圆圈是一个名为cling_bleached.png的图像。找到它(drawable-xhdpi 文件夹)并调整它的大小(从 800x800 到 400x400)

  2. showcase_radius 设置为47(原始94 的一半)。不要改变其他两个半径。

  3. 不要在 ShowcaseView.Builder 中使用 true。

于 2015-02-27T00:51:24.237 回答
0

这是我使用的解决方案。

我确实更喜欢它,因为它不会修改ShowcaseView的原始来源。

但它使用反射

  1. 首先将任何所需的值设置到您的资源 xml 中,例如

    <dimen name="sv_radius">40dp</dimen>
    
  2. 使用此方法创建 ShowcaseView.Builder 的实例

        private ShowcaseView.Builder createShowcaseViewBuilder() {
    
            ShowcaseView.Builder showcaseViewBuilder = new ShowcaseView.Builder(activity, true)
                    /**
                     * set theme
                     */
                    .setStyle(R.style.ShowcaseTheme4);
            /**
             * Load the new radius from resource xml
             */
            float radius = activity.getResources().getDimension(R.dimen.sv_radius);
    
            try {
                Field showcaseViewField = ShowcaseView.Builder.class.getDeclaredField("showcaseView");
                showcaseViewField.setAccessible(true);
                Object showcaseViewObject = showcaseViewField.get(showcaseViewBuilder);
                Field showcaseDrawerField = ShowcaseView.class.getDeclaredField("showcaseDrawer");
                showcaseDrawerField.setAccessible(true);
                Object showcaseDrawerObject = showcaseDrawerField.get(showcaseViewObject);
    
                Field innerRadiusField = null;
                try {
                    innerRadiusField = showcaseDrawerObject.getClass().getDeclaredField("innerRadius");
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
                if (null != innerRadiusField) {
                    /**
                     * detected that the new showcase-drawer is used
                     */
                    innerRadiusField.setAccessible(true);
    
                    Field outerRadiusField = showcaseDrawerObject.getClass().getDeclaredField("outerRadius");
                    outerRadiusField.setAccessible(true);
    
                    float oldInnerRadius = (float) innerRadiusField.get(showcaseDrawerObject);
                    float oldOuterRadius = (float) outerRadiusField.get(showcaseDrawerObject);
                    float newOuterRadius = radius * (oldOuterRadius / oldInnerRadius);
    
                    innerRadiusField.set(showcaseDrawerObject, radius);
                    outerRadiusField.set(showcaseDrawerObject, newOuterRadius);
                } else {
                    /**
                     * detected that the old showcase-drawer is used (no outer radius)
                     */
                    Field showcaseRadiusField = showcaseDrawerObject.getClass().getDeclaredField("showcaseRadius");
                    showcaseRadiusField.setAccessible(true);
                    showcaseRadiusField.set(showcaseDrawerObject, radius);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return showcaseViewBuilder;
        }
    
于 2016-02-28T17:39:42.447 回答