Comment changer la couleur de overscroll bord et overscroll éclat

Comment changer la couleur du bord de défilement et de la lueur de défilement ou comment changer la couleur blanche (couleur par défaut) de android release 5.0 lollipop?

23
demandé sur Ahmed Hegazy 2014-12-07 16:13:33

4 réponses

la couleur luminescente overscroll hérite de la valeur de couleur primaire définie par android:colorPrimary dans toute votre application. Mais Si vous avez besoin de spécifier une valeur différente, utilisez simplement android:colorEdgeEffect.

<style name="MyAppTheme" parent="***">
   <item name="android:colorEdgeEffect">@color/my_color</item>
</style>
46
répondu Ahmed Hegazy 2014-12-07 13:38:01

LOLLIPOP au bord de l'éclat hérite de colorPrimary. Après que la vue est créée la couleur de lueur de bord ne peut être changée que par la réflexion. Cela peut être utile lorsque vous chargez les couleurs dynamiquement en utilisant Palette.

EDIT: TL;DR: téléchargez toute la classe ici: https://github.com/consp1racy/android-commons/blob/master/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java

PROGUARD SETUP: Si vous êtes pour utiliser ceci sur les widgets de la bibliothèque de soutien, vous devez garder les noms de champ. La manière la plus rapide de le faire est la suivante (bien que cela reste un gaspillage):

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

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

Créer une classe utilitaire avec le code suivant:

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();
    }
  }
}
24
répondu Eugen Pechanec 2017-07-07 04:01:39

si vous utilisez la dernière implémentation de RecyclerView, il est assez simple de changer la couleur de débordement de façon programmatique. Utilisez le code suivant (Kotlin implementation):

recyclerView.edgeEffectFactory = object : RecyclerView.EdgeEffectFactory() {
    override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
        return EdgeEffect(view.context).apply { setColor(color) }
    }
}

notez que cela ne fonctionne que pour L'API Niveau 21 (Lollipop) et au-dessus. Si vous connaissez la valeur au moment de la compilation, utilisez colorEdgeEffect comme l'a souligné Ahmed.

5
répondu Phoca 2018-03-14 15:11:51

en pré-lollipop l'effet glow est en fait un Drawable intégré dans les ressources de L'OS, vous pouvez appliquer un ColorFilter sur cela:

public static void changeOverScrollGlowColor(Resources res, int colorID ) {
    try {
        final int glowDrawableId = res.getIdentifier("overscroll_glow", "drawable", "android");
        final Drawable overscrollGlow = res.getDrawable(glowDrawableId);
        overscrollGlow.setColorFilter(res.getColor(colorID), android.graphics.PorterDuff.Mode.SRC_ATOP);

        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);
    } catch (Exception ignored) {
    }
}

L'appeler une fois en onCreate est suffisant.

changeOverScrollGlowColor(getResources(), R.color.colorPrimary);
0
répondu John 2018-08-21 15:48:46