ScrollView:如何使用Holo更改边缘效果颜色

5
我目前正在尝试更改滚动视图到达顶部或底部时出现的蓝色水平线的颜色。我尝试在Android res文件夹中查找,但没有找到明显的参考内容。如有帮助将不胜感激。
谢谢。
更新:尝试实现继承ScrollView类并将getSolidColor设置为替代值的方法后,似乎无效。当我到达滚动视图的底部或顶部时出现的水平条仍然是蓝色的。
更新2:实际上,我不应该提到边缘效果颜色,更具体来说是overScroll效果,但我不知道这个术语。

你可能会发现这个答案很有用。 - Kevin Coppock
7个回答

8

我找到了我的问题的部分答案,实际上我指的是ScrollView的overscroll属性。似乎可以使用以下代码禁用它:

<ScrollView
...
android:overScrollMode="never"
... />

然而,使用overScrollHeader和overScrollFooter属性修改颜色是不可能的,因为它们的值会被忽略,只会显示默认的蓝色。

你在这方面有什么想法了吗? - Geeks On Hugs
不,我只是禁用了它们。 - Moystard
这实际上不是答案。我想要事件本身,但需要禁用UI边缘效果。 - Cynichniy Bandera

5

3

您可以通过反射来改变ScrollViewEdgeEffect颜色:

public static void setEdgeGlowColor(final ScrollView scrollView, final int color) {
    try {
        final Class<?> clazz = ScrollView.class;
        final Field fEdgeGlowTop = clazz.getDeclaredField("mEdgeGlowTop");
        final Field fEdgeGlowBottom = clazz.getDeclaredField("mEdgeGlowBottom");
        fEdgeGlowTop.setAccessible(true);
        fEdgeGlowBottom.setAccessible(true);
        setEdgeEffectColor((EdgeEffect) fEdgeGlowTop.get(scrollView), color);
        setEdgeEffectColor((EdgeEffect) fEdgeGlowBottom.get(scrollView), color);
    } catch (final Exception ignored) {
    }
}

@SuppressLint("NewApi")
public static void setEdgeEffectColor(final EdgeEffect edgeEffect, final int color) {
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            edgeEffect.setColor(color);
            return;
        }
        final Field edgeField = EdgeEffect.class.getDeclaredField("mEdge");
        final Field glowField = EdgeEffect.class.getDeclaredField("mGlow");
        edgeField.setAccessible(true);
        glowField.setAccessible(true);
        final Drawable mEdge = (Drawable) edgeField.get(edgeEffect);
        final Drawable mGlow = (Drawable) glowField.get(edgeEffect);
        mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mEdge.setCallback(null); // free up any references
        mGlow.setCallback(null); // free up any references
    } catch (final Exception ignored) {
    }
}

2
我发现了一种非常简单(但有些hackish)的方法来实现这个目标(改变发光的颜色):
int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
androidGlow.setColorFilter(brandColor, PorterDuff.Mode.MULTIPLY);

我利用了辉光效果实际上是一个Drawable(并且不可变),并在其上应用了过滤器。 更多信息,请参见此处:http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/


很好。但除了发光的灯之外,还有一条线会在向上滑动时出现在上方,在向下滑动时出现在下方。你知道如何改变它的颜色吗? - WWJD

1

似乎没有一种简单的方法可以使用API来完成此操作。但是,您可以尝试扩展ScrollView并覆盖getSolidColor()方法,将背景设置为不同的颜色:

    new ScrollView(this) {
        @Override
        @ExportedProperty(category = "drawing")
        public int getSolidColor() {
            // Set a background color to a color you want for the edges.
        }
    };

我会尝试并给你反馈。奇怪的是,你不能轻松地做到这一点,因为这种蓝色不适合大多数应用程序主题。 - Moystard
完成了,但好像没有生效,蓝色的水平条仍然是蓝色的。 - Moystard

1
如果您希望淡出边缘和ScrollView背景具有相同的颜色,只需添加以下内容即可:
<ScrollView
...
android:background="@color/yourColor"
... />

如果您想要边缘有不同的颜色,那么您需要扩展ScrollView并覆盖getSolidColor()方法。


0

这是更改超滚动边缘线的方法:

        final int edgeDrawableId = res.getIdentifier("overscroll_edge", "drawable", "android");
        final Drawable overscrollEdge = res.getDrawable(edgeDrawableId);
        overscrollEdge.setColorFilter(res.getColor(colorID), android.graphics.PorterDuff.Mode.SRC_ATOP);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接