2014-12-07 6 views

Antwort

37

Die Overscroll-Leuchtfarbe erbt den Primärfarbenwert, der in Ihrer gesamten App durch android:colorPrimary festgelegt wurde. Wenn Sie jedoch einen anderen Wert angeben müssen, verwenden Sie einfach android:colorEdgeEffect.

<style name="MyAppTheme" parent="***"> 
    <item name="android:colorEdgeEffect">@color/my_color</item> 
</style> 
+0

Dieses Attribut ist nur für API 21 und höher verfügbar. – fractalwrench

+0

Ja, das ist, was die Frage besagt. –

+3

Beachten Sie, dass 'android: colorPrimary' auch die Farbe Ihrer ActionBar oder Toolbar festlegt. Wohingegen 'android: colorEdgeEffect' spezifischer ist und nur für ListViews, RecyclerViews usw. gilt. –

22

Auf LOLLIPOP der Rand glow erbt von colorPrimary. Nachdem die Ansicht erstellt wurde, kann die Kantenglühfarbe nur durch Reflexion geändert werden. Dies kann nützlich sein, wenn Sie Farben dynamisch mit Palette laden.

EDIT: TL; DR: die ganze Klasse Download von hier: https://github.com/consp1racy/android-commons/blob/master/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java

PROGUARD SETUP: Wenn Sie vorhaben, diese von Support-Bibliothek auf Widgets zu verwenden, müssen Sie die Feldnamen halten . Schnellste Weg, es zu tun, ist die folgende (wenn auch noch verschwenderisch):

-keepclassmembers class * extends android.view.View { 
    <fields>;  
} 

-keepclassmembers class android.support.v4.widget.EdgeEffectCompat { 
    <fields>;  
} 

Erstellen Sie eine Utility-Klasse mit dem folgenden Code:

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(); 
    } 
    } 
} 
+1

Schön! Ich suchte nach einer Möglichkeit, die Leuchtfarbe programmgesteuert zu ändern, und jede Antwort bezog sich auf das Festlegen des Stils in XML. Deine Arbeit hat für mich problemlos funktioniert und ich kann jetzt die Farbe dynamisch ändern, abhängig vom Kontext, wie ich es für die Statusleiste und die Werkzeugleiste mache. Vielen Dank! – MrBrightside

+0

danke. es funktioniert gut. Aber was ist mit 'RecyclerView'? – sajad

+1

@sajad Hier ist die Klasse, die ich verwende, um die Mehrheit der Scroll-Container zu behandeln http://pastebin.com/TAujMUu9 Die einzige fehlende ist 'HorizontalScrollView' denke ich. –

Verwandte Themen