Управление цветом края затухания в 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) {
    }
}

Ответ 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/