2011-01-13 10 views
14

Ich habe ein Thema, das von Androids Standardlichtthema abstammt. Meine ListViews sind mit einem weißen Hintergrund konfiguriert, und ich schätze als Nebeneffekt, dass die Farbe der verblassenden Kante weiß ist, was ich nicht möchte - ich möchte, dass sie schwarz sind.Die Farbe der verblassenden Kante in ListViews steuern

Es scheint unmöglich, einfach die Farbe des Randes ändern (obwohl ich die Länge und andere Faktoren steuern kann), und den üblichen Vorschlag eine schwarze Farbe für Listenansicht des Hinweis Farbergebnis in einigen ziemlich schrecklichen Nebenwirkungen der Verwendung, wenn die Liste scrollt.

Kann jemand einen zuverlässigen Weg empfehlen, die Farbe der verblassenden Kante zu einer willkürlichen Farbe zu ändern?

Antwort

18

Leider können Sie dies nicht einfach tun. Der ganze Sinn der verblassenden Kanten besteht darin, in den Hintergrund zu treten und nicht irgendeine zufällige Farbe zu zeichnen. Sie können jedoch versuchen, ListView zu erweitern und getSolidColor() zu überschreiben, um die gewünschte Farbe für die Überblendungskanten zurückzugeben. Es sollte gut funktionieren.

+0

Ich habe diese Arbeit hatte, aber als die Methode Name schon sagt, die Fading-Bereich reagiert nicht auf die Alpha-Version von der Farbe, die Sie in setzen –

34

Es ist eigentlich viel einfacher als das.

Mit der Einstellung: 'android: cacheColorHint' können Sie die Farbe der Überblendung beliebig ändern.

zB:

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

Ich habe meine transparent eingestellt, mit der Folge, dass die Kanten überhaupt nicht verblassen. Kannst du das umgehen? –

+1

Transparent würde eigentlich den meisten Sinn machen und Sie würden denken, dass das eigentlich der Standard wäre, aber aufgrund der Art, wie es implementiert wird (in dem es eine Überlagerung der angegebenen Farbe anwendet), ist dies nicht möglich. Am besten ist es, wenn Sie eine Farbe verwenden, die Ihrem Hintergrund am ehesten entspricht, oder vielleicht sogar transparent ist, ist die beste Lösung. – Scott

+0

Nein, es ist transparent ohne Probleme, aber jetzt habe ich keine verblassenden Kanten. –

10

Ich hatte das Problem, dass Weiß die "Overscroll" -Farbe war, nicht wirklich die verblassende Kante.

versuchen, diese (vorausgesetzt, Sie einen verblassenden Rand wollen, aber nicht die schrecklichen weißen Glanz, wenn Sie die Enden treffen (sonst eingestellt erfordert Rand keine Fading)!):

<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

Wenn Sie den „Rand bedeuten glühen/Effekt“, ich habe einen sehr einfachen (aber hackish) Weg, diesen (das Ändern die Farbe des Leuchtens) zu erreichen gefunden: dass der Leuchteffekt ist eigentlich ein Auslosungs

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

ich nutzte die Tatsache (und un-mutate bei diesem) und wendete einen Filter darauf an. Mehr dazu hier: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

können Sie die EdgeEffect Farbe eines mit Reflexion ListView oder GridView ändern. Kopieren Sie die folgenden statischen Factory-Methoden in Ihr Projekt und verwenden 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) { 
    } 
}