10

我有一个ListView, 和一个自定义样式,基本上看起来就像 Holo,但带有黄色口音而不是蓝色。

当我滚动到列表的底部或顶部时,我得到了不合适的蓝色。overscroll_glow.png我为and制作了自定义可绘制对象overscroll_edge.png,但我不知道如何使用它们。

我怎样才能让我ListView使用这些绘图而不是系统绘图?

OverScroller上课会有帮助吗?

4

6 回答 6

8

您可以使用类似反射的解决方案来破解更改此发光颜色的方法:

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

我遇到了同样的问题,这似乎是一个很好的解决方案,至少在 Google 添加用于更改颜色(或标记颜色)的 API 之前:http: //evendanan.net/android/branding/2013/12/09/品牌边缘效应/

于 2013-12-09T19:22:55.153 回答
5

只需使用这个库。在没有过度滚动的设备(HTC One X/Sense 4.5)上,我只遇到了在横向弹出菜单上包装上下文的问题。奇迹般有效!

https://github.com/AndroidAlliance/EdgeEffectOverride

于 2013-08-02T21:18:27.810 回答
4

试过这个?设置OverscrollFooter(可绘制)

更新 1

哎呀。没关系。您可能已经看过这个讨论

发光行为包含在EdgeEffect 类中。setOverScrollMode(OVER_SCROLL_NEVER)您可以通过调用您的 ListView 然后滚动您自己的 EdgeEffect 类来禁用默认边缘效果(此时我无法了解其详细信息)。

更新 2

哎哟。在 AbsListView 中创建的 EdgeEffect 对象的调用被深深地隐藏在滚动逻辑中。可能很艰难。一个简单的解决方法是向 Android 团队提出功能请求,以获取setEdgeEffect(EdgeEffect)AbsListView 中的方法...

于 2012-08-24T01:39:38.783 回答
3

这是您的解决方案:

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);
    }
}
于 2015-02-11T09:23:16.157 回答
3

请不要忘记更改过卷边缘线:

        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);
于 2015-03-25T14:23:33.283 回答
0

我添加此答案是因为这是该主题的最佳结果之一,并且最佳答案不再正确。好吧,它实际上是用于棒棒糖之前的版本,但正如预期的那样,当你使用 java 反射时,你会被咬回来,这就是发生的事情,如果你使用代码

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);

这将在 Lollipop + 设备中崩溃,因为该资源不再存在。所以对于 android 5.+ 你应该使用:

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

values-v21/themes.xml在您的主题中,如果您的目标不是最低 21 版本,则在文件中覆盖

于 2015-01-22T15:50:27.653 回答