我目前正在尝试更改当您到达滚动视图的顶部或底部时出现的蓝色水平线的颜色。我试图在Android的res文件夹中挖掘,但找不到任何明显的参考。
任何帮助都将不胜感激。
谢谢。
更新:在尝试实现一个继承ScrollView的类并将getSolidColor设置为替代值后,它似乎不起作用。当我到达滚动视图的底部或顶部时,出现的水平条仍然是蓝色的。
更新2:事实上,我不应该提到边缘效果颜色,更具体地说是overScroll效果,但我不知道这个词。
我找到了问题的部分答案,实际上我指的是ScrollView的overcroll属性。似乎可以使用以下代码禁用它:
<ScrollView
...
android:overScrollMode="never"
... />
但是,无法使用overScrollHeader和overScrollFooter属性修改颜色,因为它们的值被忽略,而是显示默认的蓝色。
您可以使用"边缘效果覆盖库"动态覆盖滚动视图上发光边缘的颜色。它使用起来非常简单,可以为您的应用程序添加一点独特性。在此处查找:https://github.com/AndroidAlliance/EdgeEffectOverride
您可以通过一些反射更改ScrollView
的EdgeEffect
颜色:
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) {
}
}
我找到了一种非常简单(但很难)的方法来实现这一点(更改辉光的颜色):
int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
androidGlow.setColorFilter(brandColor, PorterDuff.Mode.MULTIPLY);
我利用了这样一个事实,即辉光效果实际上是一个可绘制的(并且在这一点上没有变化),并在它上应用了一个过滤器。更多信息,请点击此处:http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/
使用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.
}
};
如果你想让渐变边缘和ScrollView的背景颜色相同,你可以添加:
<ScrollView
...
android:background="@color/yourColor"
... />
如果希望边是不同的颜色,则必须扩展ScrollView并覆盖getSolidColor()
方法。
这是更改过度折叠边缘线的方法:
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);