我可以通过属性android:cacheColorHint控制ListView的淡化边缘。这一切都很好,非常方便。我可以设置颜色和强度(通过向颜色属性添加alpha)
逻辑上我希望控制scrollView的渐弱边缘同样简单,但事实并非如此。有一些解决方案,但它们并不理想。
我的问题是,是否有人找到了更好的解决方案。一种解决方案,可让您在不使用background属性的情况下控制ScrollViews渐变边缘的颜色和强度。
答案 0 :(得分:6)
您的解决方案#2(使用ScrollView背景属性)有效,因为您可以克服您提到的一个问题(您可能希望背景和淡入淡出颜色不同)。 [基于Android 1.6 donut-release2的答案]
我认为这是你正在尝试的,其中边缘渐渐变为0x8800FF00并且一般背景不同(在这种情况下,它在0x8800FF00之上为0x88FFFFFF只是为了表明alpha是相关的)并且子背景仍然不同(按钮和黑白文本部分是不透明的:
注意布局文件中的背景设置:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#8800FF00"
>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#88FFFFFF"
>
<Button android:text="Hello no style" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
...
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:textColor="#80ffffff" android:text="#80ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
...
</LinearLayout>
<LinearLayout
android:background="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:textColor="#80ffffff" android:text="#80ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
...
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
View.java应用边的方法是首先绘制ScrollView的背景(如果有的话),然后在屏幕外的位图(称为ContentBitmap)中绘制ScrollView的内容并将带有DST_OUT xfermode的LinearGradient应用于边缘。 DST_OUT仅使用源中的alpha,而LinearGradient / DST_OUT使ContentBitmap的边缘逐渐变得更加透明和黑暗。 View.draw()然后通过SRC_OVER xfermode将ContentBitmap合并到主画布,这使得先前绘制的背景通过半透明的ContentBitmap像素显示。
备注强>
对于adroid:colorCacheHint
,它是ListView(但不是ScrollView)用来覆盖View.getSolidColor()
的值,这反过来导致View.draw()
调用View.ScrollabilityCache.setFadeColor()
和创建一个SRC_OVER LinearGradient而不是DST_OUT。 setFadeColor()
强制渐变范围从hintColor|0xFF000000
到0x0
。另请注意,SRC_OVER不会使ContentBitmap中的结果像素比现在更透明,因此fade的这种纯色变化实际上是一种褪色效果,而不是淡入淡出像素-with透明度。
View.java中的淡化边缘功能是私有的;自定义它是在你的子类中重新实现它。
我为ListView尝试了相同的背景设置(从ListActivity获得),但似乎淡入淡出已经通过背景应用了。另一天的谜题。