Как отобразить сплошной цвет в качестве затухающего края сверху в ScrollView Android

Вопрос или проблема

Я пытаюсь создать пользовательский ScrollView в Android, где я хочу отобразить однотонный цвет (#232325) вверху в качестве эффекта затухания. Цель состоит в том, чтобы верхний эффект затухания вел себя как сплошной цветной блок, а не как градиент.

Мой расширенный класс для ScrollView выглядит следующим образом:

class TopFadeEdgeScrollView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : ScrollView(context, attrs, defStyleAttr) {

    private val fadeHeight = 100 // Высота для эффекта затухания вверху
    private val solidColor = Color.parseColor("#232325") // Сплошной цвет

    private val paint = Paint().apply {
        color = solidColor
        style = Paint.Style.FILL
    }

    init {
        setFadingEdgeLength(fadeHeight)
    }

    override fun getBottomFadingEdgeStrength(): Float {
        return 0.0f // Отключить затухание внизу
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // Нарисовать сплошной цвет вверху
        canvas.drawRect(0f, 0f, width.toFloat(), fadeHeight.toFloat(), paint)
    }
}

myFargment.xml

<?xml version="1.0" encoding="utf-8"?>
<com.example.anymax_v1.TopFadeEdgeScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:fadingEdgeLength="140dp"
    android:requiresFadingEdge="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layoutDirection="rtl"
        android:orientation="vertical">

        <include layout="@layout/home_pinned_episode_recycle" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="1500dp"
            android:background="@color/purplemain"
            android:text="@string/app_name" />

    </LinearLayout>
</com.example.anymax_v1.TopFadeEdgeScrollView>

Ожидаемый результат:

1/ Сплошной цвет (#232325), появляющийся в качестве верхнего эффекта затухания, который покрывает определенную высоту (например, 140dp).

2/ Без градиента, без прозрачности — просто сплошной цветной блок.

3/ Нижний эффект затухания должен быть полностью отключен.

Фактический результат:

Я все еще вижу легкий градиент или эффект альфа-смешивания вверху, даже несмотря на то, что я установил одинаковые начальные и конечные цвета для LinearGradient.

Похоже, градиент или прозрачность все еще применяются, несмотря на использование сплошного цвета.

Как я могу создать верхний эффект затухания с сплошным цветом и полностью отключить нижний эффект затухания? Что может вызывать нежелательный градиентный эффект?

Ответ или решение

Чтобы создать кастомный ScrollView в Android, который отображает сплошной цвет в верхней части в качестве эффекта затухания, можно использовать ваш класс TopFadeEdgeScrollView, который вы уже начали реализовывать. Однако, чтобы полностью избавиться от эффекта градиента и обеспечить полноцветное затухание, нужно внести несколько изменений.

Класс TopFadeEdgeScrollView

Ваш класс уже почти готов, но давайте убедимся, что мы правильно настраиваем затухание и удаляем все лишние эффекты. Вот исправленная версия вашего кода:

class TopFadeEdgeScrollView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : ScrollView(context, attrs, defStyleAttr) {

    private val fadeHeight = 100 // Высота для эффекта затухания
    private val solidColor = Color.parseColor("#232325") // Сплошной цвет

    private val paint = Paint().apply {
        color = solidColor
        style = Paint.Style.FILL
    }

    init {
        // Устанавливаем длину затухания. Это значение может быть произвольным,
        // но в данном случае оно не повлияет на окончательный результат.
        setFadingEdgeLength(0) 
    }

    override fun getTopFadingEdgeStrength(): Float {
        // Убедитесь, что значение является максимальным 
        return 1.0f
    }

    override fun getBottomFadingEdgeStrength(): Float {
        return 0.0f // Отключаем затухание снизу
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // Рисуем сплошной цвет в верхней части
        canvas.drawRect(0f, 0f, width.toFloat(), fadeHeight.toFloat(), paint)
    }

    override fun computeVerticalScrollRange(): Int {
        // Это поможет определить правильную область прокрутки
        return super.computeVerticalScrollRange() + fadeHeight
    }
}

XML-файл вашего фрагмента

Ваш XML-файл выглядит корректно, но убедитесь, что вы правильно указываете fadingEdgeLength. Так как мы убрали затухание, это значение может быть установлено на 0.

Вот пример вашего XML-файла:

<?xml version="1.0" encoding="utf-8"?>
<com.example.anymax_v1.TopFadeEdgeScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:fadingEdgeLength="0dp"
    android:requiresFadingEdge="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layoutDirection="rtl"
        android:orientation="vertical">

        <include layout="@layout/home_pinned_episode_recycle" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="1500dp"
            android:background="@color/purplemain"
            android:text="@string/app_name" />

    </LinearLayout>
</com.example.anymax_v1.TopFadeEdgeScrollView>

Ожидаемый результат

После этих изменений вы должны увидеть:

  1. Сплошной цвет #232325, появляющийся в верхней части в качестве эффекта затухания, с заданной высотой.
  2. Отсутствие градиентного или прозрачного эффекта — только сплошной цвет.
  3. Полное отключение эффекта затухания внизу.

Примечание

Если по-прежнему наблюдается какой-либо эффект затухания, убедитесь, что другие элементы пользовательского интерфейса (такие как LinearLayout или TextView) не имеют свойств, которые могут создавать прозрачные градиенты в верхней области.

Попробуйте эти изменения и посмотрите, решает ли это вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...