Ваше решение № 2 (используйте свойство фона ScrollView) работает, потому что вы можете преодолеть одну проблему, о которой вы упомянули (возможно, вы захотите, чтобы цвета фона и затухания были разными).[Ответ основан на Android 1.6 donut-release2]
Я думаю, это то, что вы пытаетесь, где края исчезают до 0x8800FF00, а общий фон отличается (в этом случае это 0x88FFFFFF поверх 0x8800FF00 просто дляпокажите, что альфа релевантна) и дочерние фоны по-прежнему различны (кнопки и черно-белые текстовые разделы непрозрачны):
![enter image description here](https://i.stack.imgur.com/gVdGK.png)
Обратите внимание на настройки фона в файле макета:
<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 и применитьLinearGradient с DST_OUT xfermode к краям.DST_OUT использует только альфа из источника, а LinearGradient / DST_OUT делает края ContentBitmap постепенно более прозрачными и темными.Затем View.draw () объединяет ContentBitmap с основным холстом с помощью SRC_OVER xfermode, который позволяет ранее нарисованному фону отображаться через полупрозрачные пиксели ContentBitmap.
Примечания
Какдля adroid:colorCacheHint
это значение, которое ListView (но не ScrollView) использует для переопределения View.getSolidColor()
, что, в свою очередь, заставляет View.draw()
вызвать View.ScrollabilityCache.setFadeColor()
и создать SRC_OVER LinearGradient вместо DST_OUT.setFadeColor()
заставляет градиент колебаться от hintColor|0xFF000000
до 0x0
.Также обратите внимание, что SRC_OVER не делает результирующий пиксель в ContentBitmap более прозрачным, чем он есть, так что этот сплошной цветовой эффект на самом деле представляет собой эффект рисования на углах, а не затухание пикселей-с-прозрачность.
Функция исчезающего края в View.java является частной;настроить его - это переопределить его в вашем подклассе.
Я попробовал те же настройки фона для ListView (как получено из ListActivity), но оказалось, что замирание применялось прямо через фон.Головоломка на другой день.