自定义过度滚动发光/边缘颜色为ListView?

时间:2012-08-24 01:23:32

标签: android android-layout android-widget android-listview

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

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

如何让ListView使用这些drawable而不是系统?

OverScroller班会帮忙吗?

6 个答案:

答案 0 :(得分: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/branding-edge-effect/

答案 1 :(得分:5)

只需使用此库。我只是在没有过度滚动的设备(HTC One X / Sense 4.5)上在横向菜单中包装上下文时遇到问题。像魅力一样工作!

https://github.com/AndroidAlliance/EdgeEffectOverride

答案 2 :(得分:4)

试过这个? setOverscrollFooter(Drawable)

更新1

糟糕。没关系。您可能已经看过this discussion

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

更新2

哎哟。在AbsListView中创建的EdgeEffect对象的调用深埋在滚动逻辑中。可能很难。一个简单的解决方案是向Android团队提供AbsListView中的setEdgeEffect(EdgeEffect)方法的功能请求...

答案 3 :(得分: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);
    }
}

答案 4 :(得分: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);

答案 5 :(得分:0)

我添加了这个答案,因为这是该主题的最佳结果之一,而且最佳答案不再正确。 好吧,它实际上是针对pre-lollipop版本但是正如预期的那样,当你使用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>
在您的主题中

,如果您不是针对min 21版本

,则在values-v21/themes.xml文件中覆盖