2

我正在尝试在我的应用程序的 Viewpager 中自定义 EdgeEffect。目的是用自定义的红色替换蓝色 ics Overscroll EdgeEffect 即。所以起初我编辑了overscroll_edge和相应的overscroll_glow。然后我将它们都放入我的应用程序的 /res/drawable 目录中。此外,我将EdgeEffect 源文件复制到了我的应用程序的 /src/android/widget/ 目录。我在 EdgeEffect 中所做的唯一更改是导入 com.my.application.R 而不是 com.android.internal.R。

但是 Android 不会使用我的自定义 android.widget.EdgeEffect 而不是 Android 系统中的那个,所以 Viewpager EdgeEffect 一直保持蓝色。我错过了什么吗?

4

3 回答 3

8

您可以设置一些反射的EdgeEffect颜色:ViewPager

public static void setEdgeGlowColor(ViewPager viewPager, int color) {
    try {
        Class<?> clazz = ViewPager.class;
        for (String name : new String[] {
                "mLeftEdge", "mRightEdge"
        }) {
            Field field = clazz.getDeclaredField(name);
            field.setAccessible(true);
            Object edge = field.get(viewPager); // android.support.v4.widget.EdgeEffectCompat
            Field fEdgeEffect = edge.getClass().getDeclaredField("mEdgeEffect");
            fEdgeEffect.setAccessible(true);
            setEdgeEffectColor((EdgeEffect) fEdgeEffect.get(edge), color);
        }
    } catch (Exception ignored) {
    }
}

public static void setEdgeEffectColor(EdgeEffect edgeEffect, int color) {
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            edgeEffect.setColor(color);
            return;
        }
        Field edgeField = EdgeEffect.class.getDeclaredField("mEdge");
        Field glowField = EdgeEffect.class.getDeclaredField("mGlow");
        edgeField.setAccessible(true);
        glowField.setAccessible(true);
        Drawable mEdge = (Drawable) edgeField.get(edgeEffect);
        Drawable mGlow = (Drawable) glowField.get(edgeEffect);
        mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        mEdge.setCallback(null); // free up any references
        mGlow.setCallback(null); // free up any references
    } catch (Exception ignored) {
    }
}
于 2015-01-20T21:01:32.437 回答
2

您必须在自己的应用程序包(例如 com.yourapp.viewpager)中实现、ViewPagerPagerAdapterFragmentstatePagerAdapterEdgeEffectCompat。所做的唯一更改是调整导入和包名称。将资源文件复制并编辑到您的应用程序中,然后瞧,它可以工作了。EdgeEffectCompatIcsEdgeEffectres/drawable

于 2013-02-19T22:51:41.127 回答
1

我可以建议一个非常简单的方法,但是很老套:

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

我利用了发光效果实际上是一个共享的 Drawable 并在其上应用了过滤器这一事实:http ://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

于 2013-12-09T19:16:20.087 回答