在安卓4.4.2上,Drawable的setAlpha方法无效。

4
我正在使用以下函数来启用和禁用可绘制对象...
public static void setDrawableState(Drawable d, boolean enabled)
{
    if (d == null)
        return;
    d.mutate(); // so drawables don't share state anymore
    if (enabled)
        d.setAlpha(255);
    else
        d.setAlpha(100);
}

这在我尝试过的所有手机上都有效,但现在我发现它似乎不适用于Android 4.4.2(也许它甚至不是特定版本)。

是否有另一种(更好的)方法来设置可绘制对象的alpha值?或者我漏掉了什么重要的东西吗?


它在旧版本上可以正常工作吗? - weston
是的,完美地运用在“ImageButtons”、“MenuItems”、“ActionItems”上……只要我将其应用于可绘制对象,它就能正常工作……无法确定它是否适用于所有设备,但在我的设备上(HTC One Mini,4.4.3和4.3)可以。 - prom85
我认为你没有正确使用 mutate。它会返回可变实例。 - weston
Drawable d来自哪里? - pskink
从一个 ImageButtonMenuItemActionItem... 有时甚至是直接从资源中调用的可绘制对象,在调用上述函数后才被使用... 现在它们都不再起作用了... 但在其他版本中却可以。 - prom85
显示剩余2条评论
2个回答

3

由于可绘制对象可能共享相同的状态,更改可绘制对象的状态将不会产生任何效果。您需要对可绘制对象进行变异,例如在您的代码中尝试以下操作:

d.mutate().setAlpha(100);
Android开发者博客有一篇很棒的博客文章,详细解释了drawable状态和变化。

实际上,这正是我所做的事情,并且在某些 Android 版本上有效,但并非所有版本都有效... 在我的代码中,我甚至注释了调用 mutate 的那一行,并解释说,我出于与您提到的完全相同的原因这样做... - prom85

0

如果你想确保:

Drawable d2 = d.getConstantState().newDrawable().mutate();
d2.setAlpha(100)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接