private EdgeEffect mEdgeGlowTop;
private EdgeEffect mEdgeGlowBottom;
然后再看看EdgeEffect类的源码:
EdgeEffect类中有两个成员变量:
private final Drawable mEdge;private final Drawable mGlow;
在创建EdgeEffect实例时,会加载系统资源R.drawable.overscroll_edge和R.drawable.overscroll_glow对其进行赋值。
想要去掉这种效果的话,只要通过反射,将这两个属性设置为空白的Drawable资源就行了。代码如下:
1 /**
2 * 去掉ListView顶部和底部的蓝色渐变
3 *
4 * @param absListView
5 */
6 public static void cancelFadingEdge(AbsListView absListView) {
7
8 // 创建EdgeEffect实例,将mEdge和mGlow设置为空的Drawable
9 EdgeEffect edgeEffect = new EdgeEffect(absListView.getContext());
10 Class> eeClz = edgeEffect.getClass();
11 setField(eeClz, "mEdge", edgeEffect, new ColorDrawable());
12 setField(eeClz, "mGlow", edgeEffect, new ColorDrawable());
13
14 // 给ListView的mEdgeGlowTop和mEdgeGlowBottom赋值
15 try {
16 Class> lvClz = Class.forName("android.widget.AbsListView");
17 setField(lvClz, "mEdgeGlowTop", absListView, edgeEffect);
18 setField(lvClz, "mEdgeGlowBottom", absListView, edgeEffect);
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 }
23
24 /**
25 * 通过反射的方式设置变量的值
26 *
27 * @param clz
28 * 属性所在类的Class
29 * @param fieldName
30 * 属性名
31 * @param obj
32 * 要赋值的对象
33 * @param value
34 * 值
35 */
36 private static void setField(Class> clz, String fieldName, Object obj,
37 Object value) {
38 try {
39 Field field = clz.getDeclaredField(fieldName);
40 field.setAccessible(true);
41 field.set(obj, value);
42 } catch (Exception e) {
43 e.printStackTrace();
44 }
45 }
注意:
mEdge.set(edgeEffect, new ColorDrawable());
mEdgeGlowTop.set(absListView, edgeEffect);
这两个地方不能将属性设置为null,否则会出现空指针异常,因为源码里认为它们不为空,进行了一些操作。