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