Как изменить цвет края прокрутки и свечения при прокрутке или как изменить белый цвет (цвет по умолчанию) леденца на палочке Android версии 5.0?
Как изменить цвет края прокрутки и свечения над прокруткой
Ответы (4)
Цвет свечения при прокрутке наследует значение основного цвета, установленное android:colorPrimary
во всем приложении. Но если вам нужно указать другое значение, просто используйте android:colorEdgeEffect
(доступно только для API 21 и выше).
<style name="MyAppTheme" parent="...">
<item name="android:colorEdgeEffect">@color/my_color</item>
</style>
android:colorPrimary
также устанавливает цвет панели действий или панели инструментов. В то время как android:colorEdgeEffect
более конкретен и применяется только к ListViews, RecyclerViews и т. Д.
- person Mr-IDE; 27.06.2017
На LOLLIPOP
краевое свечение наследуется от colorPrimary
. После создания вида цвет свечения края можно изменить только путем отражения. Это может быть полезно при динамической загрузке цветов с помощью Palette
.
EDIT: TL; DR: Загрузите весь класс отсюда: https://github.com/consp1racy/android-commons/blob/71b5c65689786b1d52d701d81d8c7445495807c3/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java
НАСТРОЙКА ПРОГРАММЫ: если вы собираетесь использовать это для виджетов из библиотеки поддержки, вам необходимо сохранить имена полей. Самый быстрый способ сделать это следующий (хотя и расточительный):
-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();
}
}
}
RecyclerView
?
- person ; 29.11.2015
HorizontalScrollView
Думаю.
- person Eugen Pechanec; 01.12.2015
v4
на v13
в строке import
в верхней части файла.
- person Eugen Pechanec; 07.06.2016
Если вы используете последнюю версию RecyclerView, программно изменить цвет переполнения довольно просто. Используйте следующий код (реализация Kotlin):
recyclerView.edgeEffectFactory = object : RecyclerView.EdgeEffectFactory() {
override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
return EdgeEffect(view.context).apply { setColor(color) }
}
}
Обратите внимание, что это работает только для уровня API 21 (Lollipop) и выше. Если вы знаете значение во время компиляции, используйте 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; } });
- person Javatar; 07.06.2019
В pre-lollipop эффект свечения на самом деле является 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) {
}
}
Достаточно один раз вызвать его в onCreate.
changeOverScrollGlowColor(getResources(), R.color.colorPrimary);