2011-01-13 36 views
14

Tengo un tema que se deriva del tema de luz predeterminado de Android. Mis ListViews están configuradas con un fondo blanco, y supongo que como un efecto secundario de esto, el color del borde difuminado es blanco, que no es algo que quiero, me gustaría que sean negras.Controlar el color del borde de desvanecimiento en ListViews

Parece imposible simplemente cambiar el color del borde (aunque puedo controlar la longitud y otros factores), y la sugerencia habitual de usar un color negro para el color de la sugerencia de ListView produce algunos efectos secundarios bastante horribles cuando lista rollos.

¿Alguien puede aconsejar una forma confiable de cambiar el color del borde de desvanecimiento a un color arbitrario?

Respuesta

18

Lamentablemente no puede hacer esto fácilmente. El objetivo de los bordes difuminados es desvanecerse en el fondo, no dibujar un color aleatorio. Sin embargo, puede intentar extender ListView y reemplazar getSolidColor() para devolver el color que desea para los bordes difuminados. debería funcionar bien.

+0

que he tenido este trabajo, pero como sugiere el nombre del método, el área de la decoloración no responde a la alfa del color que pone en –

34

En realidad es mucho más fácil que eso.

Puede cambiar el color del fundido a cualquier cosa que desee mediante la configuración: 'android: cacheColorHint'.

por ejemplo:

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

Tengo el mío establecido en transparente, con la consecuencia de que los bordes no se están desvaneciendo en absoluto. ¿Puedes soslayar esto? –

+1

Transparente en realidad tendría más sentido y pensaría que en realidad sería el predeterminado, pero debido a la forma en que se implementa (en el que se aplica una superposición del color especificado) esto no es posible. Su mejor opción es utilizar un color que se asemeje mejor a su fondo o, incluso, tenerlo transparente es la mejor solución. – Scott

+0

No, está usando transparente sin problemas, pero ahora no tengo bordes difuminados. –

10

Tuve el problema de que el blanco era el color "Overscroll", no el fading fading.

probar esto (suponiendo que desea una ventaja desvanecimiento, pero no el blanco resplandor horrible cuando usted golpea los extremos (establecido de otro modo requiere la decoloración de punta para ninguno)!):

<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

Si se refiere a la "ventaja halo/efecto", he encontrado una manera muy simple (pero hacker) para lograr esto (el cambio del color del brillo):

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

aproveché el hecho de que el efecto de brillo es en realidad un Disponibles (y un-mutate en eso), y aplica un filtro en él. más sobre él, aquí: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

Usted puede cambiar el color de un EdgeEffectListView o GridView utilizando la reflexión. Copia los siguientes métodos de fábrica estáticas en su proyecto y utilizar 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) { 
    } 
} 
Cuestiones relacionadas