【问题标题】:Setting alpha of ColorDrawable does not work设置 ColorDrawable 的 alpha 不起作用
【发布时间】:2019-08-12 12:19:24
【问题描述】:

我试图在我的应用中实现用户向下滚动的效果,视图的不透明度将从 0 变为 1。

为了实现这一点,我用我想要的颜色蓝色创建了一个 ColorDrawable,然后将其 alpha 设置为 0。

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

但是,增加 alpha 后,它并没有改变。我已经尝试打印 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 的 alpha 不会改变?谢谢。

【问题讨论】:

  • 如果你为你正在使用的语言添加标签可能会很好(大概是Kotlin ?)。见ColorDrawable setAlpha
  • 谢谢@JonGoodwin 我已经添加了 Kotlin 标签。看了很多遍的文档,.setAlpha()函数好像没有改变color drawable中的值。
  • 请参阅 kotlin 文档。 mutateinvalidateselfsetAlpha。这在你的问题中看起来是错误的actionBarBackground.alpha = 255 something like actionBarBackground.setAlpha(255) ?
  • 谢谢乔恩。在 kotlin 中,getter 和 setter 会自动转化为属性,所以 kotlin 中的.setAlpha(255) 就是.alpha = 255。当您使用正常的 setAlpha 时,甚至 Android Studio 也建议进行此更改。但是,您对.mutate() 的看法是正确的。使用它,并用返回的变异 Drawable 替换我的 ColorDrawable,alpha 更改工作正常。感谢您的帮助!

标签: android kotlin alpha colordrawable


【解决方案1】:

我想我应该回答,正如 Lucas P. 所说:

但是,将这个 ColorDrawable 替换为您从中获得的 DrawableColorDrawable 上调用 .mutate(),使 alpha 更改生效。

但它不是出于某些原因,有一个 原因

在 API 级别 3 中添加了mutate()

open fun mutate(): Drawable

可变的 BitmapDrawable 仍然与任何其他共享其 Bitmap 来自同一资源的可绘制对象。

mutate()
Added in API level 3

public Drawable mutate ()

使这个drawable可变。此操作无法撤消。一种 mutable drawable 保证不与任何其他对象共享其状态 可绘制的。这在您需要修改属性时特别有用 从资源加载的drawables。默认情况下,所有可绘制对象 从同一资源加载的实例共享一个公共状态;如果你 修改一个实例的状态,所有其他实例都会收到 相同的修改。在可变的 Drawable 上调用此方法将 没有效果。

reference mutate

Kotlin 自动区分可变和不可变集合, --cool (如果你知道那是什么意思的话)。

一个不可变类是一个一旦它的状态就不能改变的类 已创建。
Mutability

【讨论】:

  • 感谢您的详细解释!此外,关于可变性的文章也很值得一读!
【解决方案2】:

感谢@Jon Goodwin 的评论,我终于解决了这个问题。

由于某种原因,在 Kotlin 中更改 ColorDrawable 的 alpha 值似乎没有任何效果(它曾经在 Java 中工作)。

但是,将 ColorDrawable 替换为 Drawable 您通过在 ColorDrawable 上调用 .mutate() 得到的,使 alpha 更改生效。

我的问题中的最终工作代码:

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.

P.S.:另请查看他的详细回答,了解为什么会在 Kotlin 中发生这种情况。

【讨论】:

  • 很高兴为您提供帮助;O)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多