2011-01-13 16 views
14

Ho un tema che deriva dal tema di luce predefinito di Android. Le mie ListViews sono configurate con uno sfondo bianco, e immagino come un effetto collaterale di questo, il colore del bordo in dissolvenza è bianco, che non è qualcosa che voglio - Mi piacerebbe che fossero nere.Controllo del colore del bordo in dissolvenza in ListViews

Sembra impossibile cambiare semplicemente il colore del bordo (anche se posso controllare la lunghezza e altri fattori), e il solito suggerimento di usare un colore nero per il colore suggerimento di listview provoca alcuni effetti collaterali piuttosto orribili quando il elenca le pergamene.

Qualcuno può consigliare un metodo affidabile per modificare il colore del bordo in dissolvenza su un colore arbitrario?

risposta

18

Purtroppo non è possibile farlo facilmente. L'intero punto dei bordi in dissolvenza è sfumare sullo sfondo, non per disegnare un colore casuale. Tuttavia, puoi provare ad estendere ListView e sovrascrivere getSolidColor() per restituire il colore desiderato per i bordi in dissolvenza. Dovrebbe funzionare bene.

+0

ho avuto questo lavoro, ma come suggerisce il nome del metodo, la zona dissolvenza non risponde alla alfa del colore si mette in –

34

In realtà è molto più facile di quello.

È possibile modificare il colore della dissolvenza in qualsiasi cosa si desideri utilizzando l'impostazione: 'android: cacheColorHint'.

esempio:

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

Ho il mio impostato su trasparente, con la conseguenza che i bordi non stanno affatto svanendo. Puoi aggirare questo? –

+1

Trasparente in realtà avrebbe più senso e si potrebbe pensare che sarebbe in realtà il default, ma a causa del modo in cui è implementato (in cui si applica una sovrapposizione del colore specificato) questo non è possibile. La soluzione migliore è utilizzare un colore che assomigli al meglio al tuo background o forse anche averlo trasparente è la soluzione migliore. – Scott

+0

No, sta usando trasparente senza problemi, ma ora non ho bordi sfumati. –

10

Ho avuto il problema che il bianco era il colore "Overscroll", non in realtà il bordo in dissolvenza.

provare questo (supponendo che si desidera un bordo dissolvenza, ma non il bagliore bianco orribile quando si colpisce le estremità (altrimenti impostare richiede dissolvenza bordo a nessuno)!):

<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

Se si intende il "bordo glow/effetto", ho trovato un modo molto semplice (ma hacker) per raggiungere questo obiettivo (cambiare il colore del bagliore):

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

ho approfittato del fatto che l'effetto bagliore è in realtà un Drawable (e un-mutate a quello), e applicato un filtro su di esso. di più, qui: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

È possibile modificare il colore di una riflessione EdgeEffectListView o GridView usando. Copiare i seguenti metodi factory statici nel progetto e utilizzare 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) { 
    } 
} 
Problemi correlati