Управление цветом края затухания в ListViews
У меня есть тема, основанная на легкой теме Android по умолчанию. Мои списки ListView настроены с белым фоном, и я предполагаю, что это побочный эффект, цвет затухающего края белый, что не то, что я хочу - я бы хотел, чтобы они были черными.
Кажется невозможным просто изменить цвет края (хотя я могу контролировать длину и другие факторы), и обычное предложение использовать черный цвет для цвета подсказки listview приводит к некоторым довольно ужасным побочным эффектам, когда список свитки.
Может ли кто-нибудь посоветовать надежный способ изменения цвета затухающего края на произвольный цвет?
Ответы
Ответ 1
К сожалению, вы не можете сделать это легко. Вся точка затухающих краев должна затухать в фоновом режиме, а не рисовать какой-то случайный цвет. Тем не менее, вы можете попытаться расширить ListView и переопределить getSolidColor(), чтобы вернуть цвет, который вы хотите для краев затухания. Он должен работать нормально.
Ответ 2
На самом деле это намного проще.
Вы можете изменить цвет затухания на все, что хотите, используя настройку: android: cacheColorHint.
например:
<ListView
....
android:cacheColorHint="#FFFFFF"
/>
Ответ 3
У меня была проблема, что белый цвет был "Overscroll", а не фактически исчезающим краем.
попробуйте это (предполагая, что вам нужен затухающий край, но не ужасный белый блеск, когда вы нажмете на концы! (в противном случае для него требуется затухающий край)):
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:requiresFadingEdge="vertical"
android:fadingEdgeLength="10dp"
android:overScrollMode="never" > </-- this is the line you want i think -->
</ListView>
Ответ 4
Вы можете изменить цвет EdgeEffect
ListView
или GridView
с помощью отражения. Скопируйте следующие статические методы factory в свой проект и используйте setEdgeGlowColor(yourListView, yourAwesomeColor);
:
public static void setEdgeGlowColor(AbsListView listView, int color) {
try {
Class<?> clazz = AbsListView.class;
Field fEdgeGlowTop = clazz.getDeclaredField("mEdgeGlowTop");
Field fEdgeGlowBottom = clazz.getDeclaredField("mEdgeGlowBottom");
fEdgeGlowTop.setAccessible(true);
fEdgeGlowBottom.setAccessible(true);
setEdgeEffectColor((EdgeEffect) fEdgeGlowTop.get(listView), color);
setEdgeEffectColor((EdgeEffect) fEdgeGlowBottom.get(listView), color);
} catch (Exception ignored) {
}
}
public static void setEdgeEffectColor(EdgeEffect edgeEffect, int color) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
edgeEffect.setColor(color);
return;
}
Field edgeField = EdgeEffect.class.getDeclaredField("mEdge");
Field glowField = EdgeEffect.class.getDeclaredField("mGlow");
edgeField.setAccessible(true);
glowField.setAccessible(true);
Drawable mEdge = (Drawable) edgeField.get(edgeEffect);
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 (Exception ignored) {
}
}
Ответ 5
Я опубликовал полное решение этой проблемы в классе, который расширяет ListView. Здесь: Можно ли изменить цвет FadingEdge в Listview?
Ответ 6
Если вы имеете в виду "свечение/эффект края", я нашел очень простой (но хакерский) способ выполнить это (изменение цвета свечения):
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/
Ответ 7
Эта библиотека решит вашу проблему: https://github.com/AndroidAlliance/EdgeEffectOverride