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始终保持蓝色.我错过了什么吗?
您可以使用一些反射设置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)