Android ScrollView vs ListView淡化边缘控件

时间:2011-07-07 11:53:18

标签: android android-layout

我可以通过属性android:cacheColorHint控制ListView的淡化边缘。这一切都很好,非常方便。我可以设置颜色和强度(通过向颜色属性添加alpha)

逻辑上我希望控制scrollView的渐弱边缘同样简单,但事实并非如此。有一些解决方案,但它们并不理想。

  1. 扩展ScrollView并覆盖 getSolidColor()函数。这个 允许我改变颜色 无论我想要什么,但颜色的alpha值将被忽略,所以如果我 使用0x33000000它将永远是一个 渐变从全黑到满 透明的。
  2. 使用ScrollViews背景属性。这使我既能控制颜色又能控制强度(通过alpha值),但它也会将背景设置为淡入淡出的颜色,这可能不是我想要的。
  3. 我的问题是,是否有人找到了更好的解决方案。一种解决方案,可让您在不使用background属性的情况下控制ScrollViews渐变边缘的颜色和强度。

1 个答案:

答案 0 :(得分:6)

您的解决方案#2(使用ScrollView背景属性)有效,因为您可以克服您提到的一个问题(您可能希望背景和淡入淡出颜色不同)。 [基于Android 1.6 donut-release2的答案]

我认为这是你正在尝试的,其中边缘渐渐变为0x8800FF00并且一般背景不同(在这种情况下,它在0x8800FF00之上为0x88FFFFFF只是为了表明alpha是相关的)并且子背景仍然不同(按钮和黑白文本部分是不透明的:

enter image description here

注意布局文件中的背景设置:

<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|0xFF0000000x0。另请注意,SRC_OVER不会使ContentBitmap中的结果像素比现在更透明,因此fade的这种纯色变化实际上是一种褪色效果,而不是淡入淡出像素-with透明度。

View.java中的淡化边缘功能是私有的;自定义它是在你的子类中重新实现它。

我为ListView尝试了相同的背景设置(从ListActivity获得),但似乎淡入淡出已经通过背景应用了。另一天的谜题。