设置ColorDrawable的Alpha无效

时间:2019-03-21 15:26:47

标签: android kotlin alpha colordrawable

我正在尝试在我的应用程序中实现用户向下滚动的效果,视图的不透明度将从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不变?谢谢。

2 个答案:

答案 0 :(得分:1)

由于@Jon Goodwin的评论,我终于解决了问题。

由于某种原因,在Kotlin中更改ColorDrawable上的alpha值似乎没有任何效果(以前在Java中有效)。

但是,将ColorDrawable替换为通过在Drawable上调用.mutate()所获得的ColorDrawable,可以使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.

答案 1 :(得分:1)

我想我应该回答,正如卢卡斯·P。(Lucas P.)所说:

  

不过,用您从ColorDrawable那里得到的Drawable代替   在ColorDrawable上调用.mutate()可使alpha更改生效。

但是对于某些原因 不是,有 a 原因

  在API级别3中添加了

mutate()

     

打开乐趣mutate():可绘制

     

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

mutate()
Added in API level 3

public Drawable mutate ()
  

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

reference mutate

Kotlin会自动--cool(如果您知道这是什么意思)来区分可变集合和不可变集合。

  

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