android棒棒糖scrollview边缘效果颜色

时间:2014-11-24 12:07:43

标签: android scrollview android-5.0-lollipop effect edge

在我的应用程序中,我更改了过度滚动发光效果颜色,如下所示:

int glowDrawableId = contexto.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = contexto.getResources().getDrawable(glowDrawableId);
assert androidGlow != null;
androidGlow.setColorFilter(getResources().getColor(R.color.MyColor), PorterDuff.Mode.SRC_ATOP);

但是当我更新到棒棒糖时,这段代码崩溃了。我收到以下错误代码:

FATAL EXCEPTION: main
Process: com.myproject.myapp, PID: 954
android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1233)
at android.content.res.Resources.getDrawable(Resources.java:756)
at android.content.res.Resources.getDrawable(Resources.java:724)

似乎棒棒糖中缺少overscroll_glow资源。 我怎样才能在棒棒糖中实现这一目标?

提前致谢。

6 个答案:

答案 0 :(得分:39)

您可以在主题中指定android:colorEdgeEffect以更改整个应用中的过度滚动发光颜色。默认情况下,它会继承android:colorPrimary设置的主要颜色值。

RES /值/的themes.xml:

<style name="MyAppTheme" parent="...">
    ...
    <item name="android:colorEdgeEffect">@color/my_color</item>
</style>

或者,您可以使用内联主题叠加层为单个视图修改此值。

RES /值/的themes.xml:

<!-- Note that there is no parent style or additional attributes specified. -->
<style name="MyEdgeOverlayTheme">
    <item name="android:colorEdgeEffect">@color/my_color</item>
</style>

RES /布局/ my_layout.xml:

<ListView
    ...
    android:theme="@style/MyEdgeOverlayTheme" />

答案 1 :(得分:8)

"android:colorEdgeEffect"解决方案运行良好,并且比之前的黑客攻击要好得多。但是,如果需要以原始方式更改边缘颜色,则无法使用它。

可能但是,要使用反射,直接在EdgeEffectAbsListView实例中设置ScrollView个对象。例如:

EdgeEffect edgeEffectTop = new EdgeEffect(this);
edgeEffectTop.setColor(Color.RED);

EdgeEffect edgeEffectBottom = new EdgeEffect(this);
edgeEffectBottom.setColor(Color.RED);

try {
    Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop");
    f1.setAccessible(true);
    f1.set(listView, edgeEffectTop);

    Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom");
    f2.setAccessible(true);
    f2.set(listView, edgeEffectBottom);
} catch (Exception e) {
    e.printStackTrace();
}
在Lollipop中添加了

EdgeEffect.setColor()

与任何基于反射的解决方案相同的注意事项。

答案 2 :(得分:4)

在棒棒糖中,过卷效果颜色可以使用项目样式colorPrimary定制:

<style name="MyApp" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/mycolor</item>
</style>

此项也会影响工具栏的颜色。

答案 3 :(得分:2)

我正在使用它在android L上以编程方式更改边缘颜色。这适用于listView和scrollView,并且视图可以扩展它们。

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void setEdgeEffectL(View scrollableView, int color) {
    final String[] edgeGlows = {"mEdgeGlowTop", "mEdgeGlowBottom", "mEdgeGlowLeft", "mEdgeGlowRight"};
    for (String edgeGlow : edgeGlows) {
        Class<?> clazz = scrollableView.getClass();
        while (clazz != null) {
            try {
                final Field edgeGlowField = clazz.getDeclaredField(edgeGlow);
                edgeGlowField.setAccessible(true);
                final EdgeEffect edgeEffect = (EdgeEffect) edgeGlowField.get(scrollableView);
                edgeEffect.setColor(color);
                break;
            } catch (Exception e) {
                clazz = clazz.getSuperclass();
            }
        }
    }
}

答案 4 :(得分:1)

平台21中不存在

overscroll_glow.png。您可以从平台20复制资源并使用它们。

您可以在

中找到overscroll_glow.png
  

{SDK_FOLDER} \平台\机器人-20 \数据\ RES

这样你就不会使用反射,正如你所看到的那样,在一些更新之后可能会弄乱你的程序。

答案 5 :(得分:0)

我知道我来不及了,但这对我的应用程序api> = 17来说很有效:

<style name="ListTheme" parent="Theme.AppCompat.Light.DarkActionBar">
      <item name="colorPrimary">@color/colorPrimaryDark</item>
</style>

<ListView   
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ListTheme"/>