在HorizontalScrollView
的末尾,指示灯会显示滚动内容已结束。有没有办法改变这种颜色?它在我的手机中显示为黄色。我已经将HorizontalScrollView
的背景颜色设置为我想要的背景颜色,但这种“滚动结束”的光不是我想要的那种。
编辑:
我刚刚发现此灯亮起于onOverScrollMode
(因为API级别9 - 请参阅this link)。有没有办法设置OVER_SCROLL_NEVER并保持与Eclair版本的兼容性?甚至更好:设置此灯的颜色(如果出现)?
答案 0 :(得分:2)
不幸的是,没有简单的方法来设置OverScroll EdgeEffect的颜色。
要安全地设置OVER_SCROLL_NEVER并保持与早期SDK rev兼容,您可以内省setOverScrollMode方法,如果找到则调用它。 (在3.1和2.2上测试)
setContentView(R.layout.main);
// find scroll view
HorizontalScrollView hscroll = (HorizontalScrollView)findViewById(R.id.hscroll);
try {
// look for setOverScrollMode method
Method setOverScroll = hscroll.getClass().getMethod("setOverScrollMode", new Class[] { Integer.TYPE } );
if (setOverScroll != null) {
try {
// if found call it (OVER_SCROLL_NEVER == 2)
setOverScroll.invoke(hscroll, 2);
} catch (InvocationTargetException ite) {
} catch (IllegalAccessException ie) {
}
}
} catch (NoSuchMethodException nsme) {
}
答案 1 :(得分:1)
虽然这个问题已经得到解答,但我想补充一些关于设置overScrollMode属性的方法。
1)创建一个“layout-v10”文件夹并放置备用xml布局,并根据需要设置overScrollMode属性。
2)如果#1意味着复制大量文件和复制,您也可以为HorizontalScrollView创建样式。
答案 2 :(得分:1)
您可以使用反射设置EdgeEffect
颜色。以下内容适用于API 14 +:
public static void setEdgeGlowColor(final HorizontalScrollView hsv, final int color) {
try {
final Class<?> clazz = HorizontalScrollView.class;
for (final String name : new String[] {
"mEdgeGlowLeft", "mEdgeGlowRight"
}) {
final Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
setEdgeEffectColor((EdgeEffect) field.get(hsv), color);
}
} catch (final Exception ignored) {
}
}
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");
edgeField.setAccessible(true);
final Field glowField = EdgeEffect.class.getDeclaredField("mGlow");
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) {
}
}