2011-01-13 12 views
14

Mam motyw, który pochodzi z domyślnego motywu świetlnego systemu Android. Moje Widoki list są skonfigurowane z białym tłem, i myślę, że jako efekt uboczny tego, kolor wyblakłej krawędzi jest biały, co nie jest czymś, czego chcę - chciałbym, żeby były czarne.Sterowanie kolorem zanikających krawędzi w ListViews

Nie można po prostu zmienić koloru krawędzi (chociaż mogę kontrolować długość i inne czynniki), a zwykła sugestia użycia czarnego koloru dla koloru podpowiedzi listview powoduje bardzo okropne efekty uboczne, gdy lista przewija.

Czy ktoś może doradzić niezawodny sposób zmiany koloru blaknięcie na arbitralny kolor?

Odpowiedz

18

Niestety nie można tego łatwo zrobić. Cały punkt wyblakłych krawędzi ma zniknąć w tle, aby nie narysować losowego koloru. Można jednak spróbować rozszerzyć ListView i zastąpić getSolidColor(), aby zwrócić kolor, który ma na blaknięcie krawędzi. Powinno działać dobrze.

+0

miałem tę pracę, ale jak sama nazwa wskazuje, metoda, obszar blaknięcie nie reaguje na alfa koloru można umieścić w –

34

W rzeczywistości jest to znacznie łatwiejsze.

Możesz zmienić kolor przejścia na cokolwiek, korzystając z ustawienia "android: cacheColorHint".

np

<ListView 
.... 
android:cacheColorHint="#FFFFFF" 
/> 
+0

Mam zestaw do przezroczystości, co powoduje, że krawędzie wcale nie blakną. Czy możesz to obejść? –

+1

Przejrzystość byłaby najbardziej sensowna i można by pomyśleć, że byłaby to wartość domyślna, ale ze względu na sposób jej implementacji (w której nakłada nakładkę określonego koloru), nie jest to możliwe. Najlepiej jest użyć koloru najlepiej pasującego do tła, a nawet najlepiej przezroczystego. – Scott

+0

Nie, używa przezroczystych bez problemów, ale teraz nie mam blednących krawędzi. –

10

Miałem problem z tym, że biały był kolorem "Overscroll", a nie w rzeczywistości zanikającym brzegiem.

spróbować to (zakładając chcesz blaknięcie krawędzi, ale nie okropny biały blask po trafieniu końce (inaczej ustawione wymaga blaknięcie przewagę brak)!):

<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> 
1

Jeśli masz na myśli „krawędź poświata/efekt”, znalazłem bardzo prosty (ale hackish) drogę do osiągnięcia tego celu (zmieniający kolor poświaty):

int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android"); 
Drawable androidGlow = context.getResources().getDrawable(glowDrawableId); 
androidGlow.setColorFilter(brandColor, PorterDuff.Mode.MULTIPLY); 

Skorzystałem z tego, że efekt glow jest faktycznie rozciągliwej (i w tym czasie nie mutować) i zastosował filtr. Więcej o tym tutaj: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

Można zmienić kolor EdgeEffect o ListView lub GridView użyciu odbicia. Skopiuj następujące metody statyczne fabryki do projektu i używać 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) { 
    } 
}