我有一个 ListView
,和一个定制的样式,基本上看起来就像 Holo,但是黄色的强调代替了蓝色。
当我滚动到列表的底部或顶部时,会出现不适合的蓝色。我为 overscroll_glow.png
和 overscroll_edge.png
制作了定制可绘制资源,但我不知道如何使用它们。
如何让我的 ListView
使用这些可绘制资源而不是系统的资源?
OverScroller
类会有帮助吗?
我有一个 ListView
,和一个定制的样式,基本上看起来就像 Holo,但是黄色的强调代替了蓝色。
当我滚动到列表的底部或顶部时,会出现不适合的蓝色。我为 overscroll_glow.png
和 overscroll_edge.png
制作了定制可绘制资源,但我不知道如何使用它们。
如何让我的 ListView
使用这些可绘制资源而不是系统的资源?
OverScroller
类会有帮助吗?
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/仅需使用这个库即可。 我在一个没有过度滚动条的设备上(HTC One X / Sense 4.5)使用弹出菜单时遇到了包含上下文的问题。 非常好用!
你试过这个吗?setOverscrollFooter(Drawable)?
更新1:
哎呀,算了吧。你可能已经看到这个讨论了。
发光行为包含在EdgeEffect类中。您可以通过在ListView上调用setOverScrollMode(OVER_SCROLL_NEVER)
来禁用默认边缘效果,然后滚动自己的EdgeEffect类(细节超出我现在的范围)。
更新2:
糟糕。在AbsListView内创建的EdgeEffect对象上的调用被深深地嵌入了滚动逻辑中。可能很难。一个简单的解决方法是向Android团队提出特性请求,要求在AbsListView中添加setEdgeEffect(EdgeEffect)
方法...
AbsListView
类?这对我来说太过hacky了 :( - Steven SchoenonOverScrolled()
是重要的一个)来完成,但我不确定这是否值得。 :( - heycosmo 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);
以下是解决方案:
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);
}
}
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>
如果您的目标版本不是21及以上,则在values-v21/themes.xml
文件中覆盖主题。
Context context = this;
- iqueqiorio