如何更改超滚动边缘和超滚动发光的颜色,或如何更改安卓5.0棒棒糖版本的白色(默认颜色)?
在整个应用程序中,过度滚动发光颜色继承由android:colorPrimary
设置的主要颜色值。但是,如果您需要指定不同的值,只需使用android:colorEdgeEffect
(仅适用于API 21及以上)。
<style name="MyAppTheme" parent="...">
<item name="android:colorEdgeEffect">@color/my_color</item>
</style>
android:colorPrimary
同时设置了操作栏(ActionBar)或工具栏(Toolbar)的颜色。而 android:colorEdgeEffect
则更加具体,只适用于 ListView、RecyclerView 等组件。 - Mr-IDE在 LOLLIPOP
版本中,边缘发光效果的颜色继承自 colorPrimary
。在视图创建完成后,只能通过反射来修改边缘发光效果的颜色。当您使用 Palette
动态加载颜色时,这将非常有用。
编辑: 简短概括一下:从这里下载整个类:https://github.com/consp1racy/android-commons/blob/71b5c65689786b1d52d701d81d8c7445495807c3/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java
PROGUARD 设置: 如果您要在支持库中使用此功能,则需要保留字段名称。最快捷的方法是执行以下操作(尽管仍然浪费):
-keepclassmembers class android.support.v4.widget.EdgeEffectCompat {
<fields>;
}
创建一个实用类,其中包括以下代码:private static final Class<?> CLASS_SCROLL_VIEW = ScrollView.class;
private static final Field SCROLL_VIEW_FIELD_EDGE_GLOW_TOP;
private static final Field SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM;
private static final Class<?> CLASS_LIST_VIEW = AbsListView.class;
private static final Field LIST_VIEW_FIELD_EDGE_GLOW_TOP;
private static final Field LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM;
static {
Field edgeGlowTop = null, edgeGlowBottom = null;
for (Field f : CLASS_SCROLL_VIEW.getDeclaredFields()) {
switch (f.getName()) {
case "mEdgeGlowTop":
f.setAccessible(true);
edgeGlowTop = f;
break;
case "mEdgeGlowBottom":
f.setAccessible(true);
edgeGlowBottom = f;
break;
}
}
SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = edgeGlowTop;
SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = edgeGlowBottom;
for (Field f : CLASS_LIST_VIEW.getDeclaredFields()) {
switch (f.getName()) {
case "mEdgeGlowTop":
f.setAccessible(true);
edgeGlowTop = f;
break;
case "mEdgeGlowBottom":
f.setAccessible(true);
edgeGlowBottom = f;
break;
}
}
LIST_VIEW_FIELD_EDGE_GLOW_TOP = edgeGlowTop;
LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM = edgeGlowBottom;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void setEdgeGlowColor(AbsListView listView, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
EdgeEffect ee;
ee = (EdgeEffect) LIST_VIEW_FIELD_EDGE_GLOW_TOP.get(listView);
ee.setColor(color);
ee = (EdgeEffect) LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(listView);
ee.setColor(color);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void setEdgeGlowColor(ScrollView scrollView, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
EdgeEffect ee;
ee = (EdgeEffect) SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.get(scrollView);
ee.setColor(color);
ee = (EdgeEffect) SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(scrollView);
ee.setColor(color);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
HorizontalScrollView
我想。 - Eugen PechanecrecyclerView.edgeEffectFactory = object : RecyclerView.EdgeEffectFactory() {
override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
return EdgeEffect(view.context).apply { setColor(color) }
}
}
请注意,此方法仅适用于API级别21(棒棒糖)及以上。如果您在编译时知道值,请使用由Ahmed指出的colorEdgeEffect
方法。
getRecyclerView().setEdgeEffectFactory(new RecyclerView.EdgeEffectFactory() {
@NonNull
@Override
protected EdgeEffect createEdgeEffect(@NonNull RecyclerView view, int direction) {
EdgeEffect edge = new EdgeEffect(view.getContext());
edge.setColor(ContextCompat.getColor(view.getContext(), R.color.blue));
return edge;
}
});
- Javatar在Android 5.0以下版本中,发光效果实际上是嵌入在操作系统资源中的Drawable,您可以在其上应用ColorFilter:
public static void changeOverScrollGlowColor(Resources res, int colorID ) {
try {
final int glowDrawableId = res.getIdentifier("overscroll_glow", "drawable", "android");
final Drawable overscrollGlow = res.getDrawable(glowDrawableId);
overscrollGlow.setColorFilter(res.getColor(colorID), android.graphics.PorterDuff.Mode.SRC_ATOP);
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);
} catch (Exception ignored) {
}
}
changeOverScrollGlowColor(getResources(), R.color.colorPrimary);