设置布局的透明度/不透明度

20

有没有可能设置并获取布局及其所有子视图的Alpha/Opacity值?我不是在说背景。比如一个相对布局中包含了一组视频控件,如播放、暂停和进度条。

我可以使用动画来淡入淡出,但想知道是否有直接的方法可用。

5个回答

60

您可以使用AlphaAnimation设置布局及其子视图(或任何其他视图)的alpha值,使用0持续时间和setFillAfter选项。

例如:

AlphaAnimation alpha = new AlphaAnimation(0.5F, 0.5F);
alpha.setDuration(0); // Make animation instant
alpha.setFillAfter(true); // Tell it to persist after the animation ends
// And then on your layout
yourLayout.startAnimation(alpha);

您可以在多个组件中使用一个动画以节省内存。并使用reset()重新使用,或使用clearAnimation()来丢弃alpha。

尽管看起来很粗糙和不专业,但实际上这是一种在多个视图上设置alpha的好方法,它不会占用太多内存或处理器时间。

不确定如何获取当前alpha值。


谢谢。我之前在使用动画时,是在动画完成后将对象的可见性设置为gone,而不是使用setFillAfter方法。 - Tsuma-Shifu
这似乎会破坏动画(如果在动画运行期间运行)。有什么解决方法吗? - Sufian
作为一种解决方法,我使用了一个半透明的图像作为View的背景。 - Sufian

15

这里有一个可以在所有版本中使用的方法(感谢@AlexOrlov):

@SuppressLint("NewApi")
public static void setAlpha(View view, float alpha)
{
    if (Build.VERSION.SDK_INT < 11)
    {
        final AlphaAnimation animation = new AlphaAnimation(alpha, alpha);
        animation.setDuration(0);
        animation.setFillAfter(true);
        view.startAnimation(animation);
    }
    else view.setAlpha(alpha);
}

显然,对于API小于11的情况下,如果可以的话,你应该创建一个自定义视图,在绘制其子元素(感谢@RomainGuy)之前调用Canvas.saveLayerAlpha()


谢谢Takhion。添加@SuppressLint("NewApi") :) - Nifhel
使用:ViewCompat.setAlpha(View,float)。 - TomerBu

6

Alex的解决方案可行,但另一种方法是创建一个自定义视图,在绘制其子项之前调用Canvas.saveLayerAlpha()。请注意,在Android 3.0中有一个新的View.setAlpha() API :)


谢谢,期待setAlpha方法。这是我从其他语言更习惯的东西。 - Tsuma-Shifu

3

在 API 11 之前,这将没有任何影响。” - Pang
没有这样的方法。我已将最小API设置为11。但它有ViewCompat.getAlpha(anyView)方法。 - Xar-e-ahmer Khan

0

非常抱歉我的回答,但如果您想要alpha值,您可以使用ViewCompat类

ViewCompat.setAlpha(View view, float alpha)

ViewCompat位于appcompat v4中


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