Android Viewpager EdgeEffect自定义颜色

f4t*_*0ny 2 android android-viewpager

我正在尝试在我的应用程序的Viewpager中自定义EdgeEffect.目的是取代蓝色的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始终保持蓝色.我错过了什么吗?

Jar*_*ler 7

您可以使用一些反射设置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) {
    }
}
Run Code Online (Sandbox Code Playgroud)