web-dev-qa-db-de.com

So ändern Sie die Farbe des Überscrollens Rand- und Overscroll-Glühen

So ändern Sie die Farbe des Over-Scroll-Flows und des Over-Scroll-Glühens oder wie Sie die weiße Farbe (Standardfarbe) von Android 5.0-Lutscher ändern

27
Ad Dahoun

Die Overscroll-Glow-Farbe erbt den durch Android:colorPrimary in Ihrer gesamten App festgelegten Primärfarbwert. Wenn Sie einen anderen Wert angeben müssen, verwenden Sie einfach Android:colorEdgeEffect.

<style name="MyAppTheme" parent="***">
   <item name="Android:colorEdgeEffect">@color/my_color</item>
</style>
50
Ahmed Hegazy

Bei Lollipop erbt das Edge-Glühen von colorPrimary. Nachdem die Ansicht erstellt wurde, kann die Randfarbe nur durch Reflexion geändert werden. Dies kann nützlich sein, wenn Sie Farben dynamisch mit Palette laden.

EDIT: TL; DR: Laden Sie die ganze Klasse hier herunter: https://github.com/consp1racy/Android-commons/blob/master/commons/src/main/Java/net/ xpece/Android/widget/XpEdgeEffect.Java

PROGUARD SETUP: Wenn Sie diese Option für Widgets aus der Support-Bibliothek verwenden möchten, müssen Sie die Feldnamen beibehalten. Der schnellste Weg ist der folgende (wenn auch immer noch verschwenderische):

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

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

Erstellen Sie eine Dienstprogrammklasse mit dem folgenden Code:

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
Eugen Pechanec

Wenn Sie die neueste RecyclerView-Implementierung verwenden, ist es recht einfach, die Überlauffarbe programmgesteuert zu ändern. Verwenden Sie den folgenden Code (Kotlin-Implementierung):

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

Beachten Sie, dass dies nur für API Level 21 (Lollipop) und höher funktioniert. Wenn Sie den Wert zur Kompilierzeit kennen, verwenden Sie die von Ahmed angegebene colorEdgeEffect.

8
Phoca

In Pre-Lollipop ist der Leuchteffekt eigentlich ein Drawable, der in die Ressourcen des Betriebssystems eingebettet ist. Sie können einen ColorFilter darauf anwenden:

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) {
    }
}

Es reicht aus, es einmal in onCreate aufzurufen.

changeOverScrollGlowColor(getResources(), R.color.colorPrimary);
1
John