Android ScrollView против элемента управления затуханием ListView - PullRequest
0 голосов
/ 07 июля 2011

Я могу контролировать затухание края ListView через свойство android: cacheColorHint.Это все хорошо и очень удобно.Я могу установить как цвет, так и силу (добавив альфа к свойству цвета)

Логически я ожидал бы, что будет одинаково просто управлять затухающим краем scrollView, но это не так.Есть несколько решений, но они не идеальны.

  1. Расширьте ScrollView и переопределите функцию getSolidColor (). Это позволяет мне менять цвет на любой, какой я хочу, однако альфа-значение цвета будет игнорироваться, поэтому, если яиспользуйте 0x33000000, это всегда будет градиент от полностью черного до полностью прозрачного.
  2. Используйте свойство фона ScrollViews .Это дает мне контроль над цветом и интенсивностью (через альфа-значение), но также устанавливает цвет фона на затухание, что может быть не тем, что я хочу.

Мой вопрос: нашел ли кто-нибудь лучшее решение для этого.Решение, которое даст вам контроль как цвета, так и интенсивности затухающего края ScrollViews без использования свойства background.

1 Ответ

6 голосов
/ 15 июля 2011

Ваше решение № 2 (используйте свойство фона ScrollView) работает, потому что вы можете преодолеть одну проблему, о которой вы упомянули (возможно, вы захотите, чтобы цвета фона и затухания были разными).[Ответ основан на Android 1.6 donut-release2]

Я думаю, это то, что вы пытаетесь, где края исчезают до 0x8800FF00, а общий фон отличается (в этом случае это 0x88FFFFFF поверх 0x8800FF00 просто дляпокажите, что альфа релевантна) и дочерние фоны по-прежнему различны (кнопки и черно-белые текстовые разделы непрозрачны):

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 и применить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), но оказалось, что замирание применялось прямо через фон.Головоломка на другой день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...