Настройка альфа ColorDrawable не работает

Я пытаюсь добиться эффекта в моем приложении, когда пользователь прокручивает страницу вниз, непрозрачность вида изменится с 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 ответа

Решение

Благодаря комментарию @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.

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

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

Но это не по какой-то причине, есть причина

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

открытое веселье mutate(): Drawable

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

mutate()
Added in API level 3

public Drawable mutate ()

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

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

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

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

Другие вопросы по тегам