Настройка альфа ColorDrawable не работает - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь добиться эффекта в моем приложении, когда пользователь прокручивает страницу вниз, непрозрачность вида изменится с 0 на 1.

Чтобы достичь этого, я создал ColorDrawable с моимжелаемый цвет, синий, а затем установите его альфа на 0.

val actionBarBackground = ColorDrawable(ContextCompat.getColor(it, R.color.myBlue))
(activity as? AppCompatActivity)?.supportActionBar?.setBackgroundDrawable(actionBarBackground)

Однако, после увеличения альфа, он не меняется.Я попытался напечатать значение actionBarBackground, но оно все еще 0 ...

// This is called inside a scrollview callback that calculates an alpha value between 0 and 255
actionBarBackground.alpha = 255
Log.d(TAG, "Alpha: ${actionBarBackground.alpha}") // Prints: Alpha: 0

Есть идеи, почему альфа ColorDwarable не меняется?Спасибо.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Полагаю, я должен ответить, как говорит Лукас П.

Однако, заменив это ColorDrawable на Drawable, которое вы получаете от вызов .mutate () для ColorDrawable, заставляет работать альфа-изменения.

Но это , а не по некоторым причинам , есть a по причинам :

mutate () добавлен на уровне API 3

open fun mutate (): Drawable

Изменяемый BitmapDrawable по-прежнему делится своим Bitmap с любым другим Drawable от того же ресурса.

mutate()
Added in API level 3

public Drawable mutate ()

Сделайте это рисование изменяемым. Эта операция не может быть отменена. изменяемый drawable гарантированно не разделяет его состояние с любым другим вытяжка. Это особенно полезно, когда вам нужно изменить свойства загружаемых из ресурсов. По умолчанию все отрисовки экземпляры, загруженные из одного и того же ресурса, имеют общее состояние; если ты изменить состояние одного экземпляра, все остальные экземпляры получат та же модификация. Вызов этого метода по изменяемой воле не имеет никакого эффекта.

ссылка на мутирование

Котлин различает изменяемые и неизменяемые коллекции, автоматически --cool (если вы знаете, что это значит).

Неизменяемый класс - это класс, состояние которого нельзя изменить после его был создан.
Изменчивость

1 голос
/ 27 марта 2019

Благодаря комментарию @Jon Goodwin, я наконец-то исправил проблему.

По какой-то причине изменение значения альфа на ColorDrawable в Kotlin, похоже, не имеет никакого эффекта (раньше оно работало в Java).

Однако, заменив это ColorDrawable на Drawable, полученное при вызове .mutate() на ColorDrawable, заставляет работать альфа-изменения.

Мой последний рабочий код из моего вопроса:

val actionBarBackground = ColorDrawable(ContextCompat.getColor(it, R.color.myBlue)).mutate()
// Keep in mind that actionBarBackground now is a Drawable, not a ColorDrawable
(activity as? AppCompatActivity)?.supportActionBar?.setBackgroundDrawable(actionBarBackground)

actionBarBackground.alpha = 255
Log.d(TAG, "Alpha: ${actionBarBackground.alpha}") // Prints: Alpha: 255
// This also works when called form inside a ScrolView Listener, to fade the actionbar background.
...