如何设置Android ScrollView的渐变边缘颜色?

42

我有一个白色背景的Android滚动视图,渐隐边缘是白色半透明渐变色。我想将其改为黑色而不是白色。在同一个项目中,我有一个具有白色背景和默认黑色渐隐边缘的ListView,但我找不到设置它的地方(如果有的话)。

7个回答

81

如果您想要一种不同于背景色的淡出边缘颜色,您需要覆盖ScrollView的getSolidColor()方法。例如:

@Override
public int getSolidColor() {
    return Color.rgb(0x30, 0x30, 0x30);
}

2
我不知道为什么没有人投票赞成显然是最普遍和最好的答案。只需要查看View的JavaDoc,它就清楚地说明了这一点。 - jfelectron
2
他是正确的,这是在使用背景图像时获得彩色渐变区域的唯一方法。只需扩展ListView类即可。 - Thomson Comer
2
这个问题的完整类解决方案已经发布在这里:https://dev59.com/m1HTa4cB1Zd3GeqPR37g#5877824 - Thomson Comer
如果您只是为您的列表视图使用颜色作为背景,那么Thomas Corner提到的链接提供了一个简单得多的解决方案。 - bernstein
这是正确的答案。必须接受此答案。太棒了。 - Ajay Shrestha

44

我通过试错发现了这个方法。

只需为<ScrollView>设置android:background="@color/你的颜色"。它会将阴影设置为给定颜色。


没错,非常简单。正如你所想的那样,你只需要将scrollview的直接子项设置为你想要的背景即可。谢谢! - Andrew Shooner
3
根据列表视图的加载时间,这可能看起来很尴尬。(例如,列表单元格在上面绘制之前,列表视图会出现带有背景颜色的情况) - bernstein
最好将单元格和列表视图的背景颜色设置为相同。然后只需将cachecolorhint更改为所需的边缘淡化颜色。 - bernstein

7

您可以使用:

    final int glowDrawableId = context.getResources().getIdentifier("overscroll_glow",
            "drawable", "android");
    final Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
    androidGlow.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

    int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable",
            "android");
    final Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId);
    androidEdge.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

1
好的文章描述如下:http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/ - easycheese

6

编辑:这个答案并没有回答问题,问题是关于ScrollView的。这个答案只适用于AbsListView和它的子类(包括ListView)。


淡出边缘颜色由android:cacheColorHint属性控制。

例如:

<ScrollView android:cacheColorHint="#ff000000" android:background="#ffffffff" />

将把背景设置为白色,而cacheColorHint用于绘制淡出边缘的颜色——在这种情况下,它将是黑色。


8
我尝试过这个属性,但它没有起作用。看起来这个属性/方法只适用于AbsListView - Andrew Shooner
http://developer.android.com/intl/zh-CN/reference/android/view/View.html#setDrawingCacheBackgroundColor%28int%29 这个怎么样? - Joe
我有一个关于HorizontalScrollView的问题,上述对XML的修改对它起作用了(至少在模拟器上)。 - Gimbl
这在模拟器(Android 2.3)上对我有效,但在实际设备(Motorola Razer Android 2.3.5)上无效。 - Jarrod Smith
ScrollView中没有这样的属性! - David
它不适用于ScrollView,因为该属性不存在。它仅适用于ListView。 - Dekra

6

1
据我理解这并不是真正的解决方案,但无论如何我一直在寻找这个。所以谢谢。 - Jakob Harteg

3

请执行以下操作:

  <ScrollView
    android:theme="@style/scrollUpdate"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" >

在“values\styles”中添加样式。
<style name="scrollUpdate">
    <item name="colorAccent">@color/yourcolor</item>
    <item name="android:color">@color/yourcolor</item>
    <item name="colorPrimary">@color/yourcolor</item>
    <item name="colorPrimaryDark">@color/yourcolor</item>
</style>

对我有效,谢谢!

3
如果您不知道是什么改变了您的渐变边缘的颜色,那么很可能是应用了样式或主题。请在 Activity 的清单文件中检查 android:theme="something" 是否存在。如果所使用的主题属于 android.R.style.Theme.Light 组,则渐变边缘将为白色。默认的 android.R.style.Themeandroid.R.style.Theme.Black 则会有黑色的渐变边缘。主题还会影响其他属性,因此在应用它们之前请彻底检查这些属性。

我已经检查了Activity主题,它是@android:style/Theme.NoTitleBar,源代码中只包含android:windowNoTitle=true。 - Andrew Shooner
1
以上是注释: <!-- 变体为没有标题栏的默认(深色)主题 -->因此,您正在使用包括黑色渐变边缘的深色主题。 您需要使用 Theme.Light.NoTitleBar - jqpubliq
我已经更改了这个主题,但这并没有影响到淡出边缘的颜色。 - Andrew Shooner
尝试在列表本身上设置样式,以确保它不会被更紧密的范围覆盖。 - jqpubliq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接