如何更改过度滚动边缘的颜色和过度滚动发光

Ad *_*oun 30 android overscroll android-5.0-lollipop

如何更改过度滚动边缘的颜色和过度滚动发光或如何更改android 5.0版棒棒糖的白色(默认颜色)?

Ahm*_*azy 55

过卷发光颜色继承了android:colorPrimary整个应用中设置的主要颜色值.但如果需要指定不同的值,只需使用即可android:colorEdgeEffect.

<style name="MyAppTheme" parent="***">
   <item name="android:colorEdgeEffect">@color/my_color</item>
</style>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`android:colorPrimary`还会设置ActionBar或工具栏的颜色.而'android:colorEdgeEffect`更具体,仅适用于ListViews,RecyclerViews等. (4认同)

Eug*_*nec 23

LOLLIPOP边缘发光继承自colorPrimary.创建视图后,只能通过反射更改边缘发光颜色.当您使用动态加载颜色时,这非常有用Palette.

编辑:TL; DR:从这里下载全班:https: //github.com/consp1racy/android-commons/blob/master/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java

PROGUARD SETUP:如果您要在支持库的小部件上使用它,则需要保留字段名称.最快的方法是以下(虽然仍然浪费):

-keepclassmembers class android.support.v4.widget.EdgeEffectCompat {
    <fields>;    
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码创建实用程序类:

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Pho*_*oca 12

如果您正在使用最新的RecyclerView实现,那么以编程方式更改溢出颜色非常简单.使用以下代码(Kotlin实现):

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

请注意,这仅适用于API级别21(Lollipop)及更高级别.如果您在编译时知道该值,请使用colorEdgeEffectAhmed指出的内容.