2012-08-24 14 views
10

Tengo un ListView, y un estilo personalizado que básicamente se parece a Holo, pero con acentos amarillos en lugar de azul.Color de borde/brillo de desbordamiento personalizado para ListView?

Cuando me desplazo hacia la parte inferior o superior de la lista, obtengo el azul que no se ajusta. Hice embutidos personalizados para overscroll_glow.png y overscroll_edge.png, pero no sé cómo usarlos.

¿Cómo puedo obtener mi ListView para usar estos dispositivos descartables en lugar de los del sistema?

¿Sería útil la clase OverScroller?

Respuesta

4

intenté esto? setOverscrollFooter(Drawable)?

Actualización 1:

Vaya. No importa. Probablemente ya hayas visto this discussion.

El comportamiento de brillo se envuelve en el EdgeEffect class. Puede deshabilitar los efectos de borde predeterminados llamando al setOverScrollMode(OVER_SCROLL_NEVER) en su ListView y luego desplegando su propia clase EdgeEffect (los detalles de los cuales están más allá de mí en este momento).

Actualización 2:

Ay. Las llamadas al objeto EdgeEffect creado dentro de AbsListView están ocultas en la lógica de desplazamiento. Podría ser difícil Una solución fácil sería solicitar una función al equipo de Android para un método setEdgeEffect(EdgeEffect) en AbsListView ...

+1

Probé el pie de página, no era lo que necesitaba. Entonces, ¿la única forma de hacerlo sería crear una clase personalizada 'AbsListView'? Demasiado hacky para mi gusto :( –

+0

Bueno, ahora estoy convencido de que se podía hacer subclasificando ListView y anulando una serie de métodos ('onOverScrolled()' ser el importante), pero no estoy seguro de que vale la pena . :( – heycosmo

8

Se puede utilizar una solución de reflexión similar a abrirse paso a la evolución de este color brillo:

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

me encontré con el mismo problema, y ​​parece una buena solución, al menos hasta que Google agrega una API para cambiar el color (o marcado al fuego del color): http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

+2

Multiplicar no es bueno porque mezclará tu color con el azul predeterminado. Deberías usar SrcAtop. Reemplazará completamente el color anterior. –

+0

¿Dónde se llama este código en cuanto a ScrollView? – chochim

+0

Hola Menny gracias por el post no puedo parecer conseguir esto para trabajar como he puesto este contexto 'contexto contexto = presente;' – iqueqiorio

0

añado esta respuesta porque este es uno de los mejores resultados en el tema y la respuesta de arriba no es correcta nunca más. Bueno, lo que realmente es para las versiones pre-lollipop, pero como era de esperar, cuando se utiliza Java reflexión usted es mordido la espalda, y eso es lo que pasó, si se utiliza el código

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

esto se colgará en dispositivos Lollipop + porque ese recurso ya no está allí. Entonces para Android 5.+ Se debe utilizar:

 <item name="android:colorEdgeEffect">@color/custom_color</item> 

en su tema, anulado en un archivo values-v21/themes.xml si no está apuntando min 21 versión

3

Aquí está la solución:

public static void ChangeEdgeEffect(Context cxt, View list, int color){ 

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

     EdgeEffect edgeEffectTop = new EdgeEffect(cxt); 
     edgeEffectTop.setColor(color); 
     EdgeEffect edgeEffectBottom = new EdgeEffect(cxt); 
     edgeEffectBottom.setColor(color); 

     try { 
      Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop"); 
      f1.setAccessible(true); 
      f1.set(list, edgeEffectTop); 

      Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); 
      f2.setAccessible(true); 
      f2.set(list, edgeEffectBottom); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    }else{ 
     int glowDrawableId = cxt.getResources().getIdentifier("overscroll_glow", "drawable", "android"); 
     Drawable androidGlow = cxt.getResources().getDrawable(glowDrawableId); 
     assert androidGlow != null; 
     androidGlow.setColorFilter(cxt.getResources().getColor(color), PorterDuff.Mode.SRC_ATOP); 
    } 
} 
+0

Este método funciona bien. Gracias. – BArtWell

3

Por favor, no hacer olvidarse de cambiar la línea de borde del desmonte:

 final int edgeDrawableId = res.getIdentifier("overscroll_edge", "drawable", "android"); 
     final Drawable overscrollEdge = res.getDrawable(edgeDrawableId); 
     overscrollEdge.setColorFilter(res.getColor(colorID), android.graphics.PorterDuff.Mode.SRC_ATOP); 
Cuestiones relacionadas