如何在Android的SDK-11之前更改视图的透明度(alpha)?

33

我如何在安卓SDK 11之前更改视图的透明度(alpha)?

在您建议使用具有一些透明度的背景颜色之前,请注意此方法不包括视图中的所有元素,例如按钮文本或视图组的子视图。

4个回答

26

我使用的是NineOldAndroids的ViewHelper,它是一个静态辅助类,真的很棒!这里有很多人推荐NineOldAndroids,但我没有看到提到ViewHelper。它非常容易使用。

import com.nineoldandroids.view.ViewHelper;
...

ViewHelper.setAlpha(myView, .2f);

您还可以使用它来设置其他属性,如x、y等,在设置动画或构建UI时非常方便。非常感谢Jake Wharton与社区分享他的工作!


感谢提到NineOldAndroids并提供使其正常工作的代码。 - Adam Johns
这在我的2.3.7设备上的ImageView上无法工作。有什么建议吗? - Karim Varela
如果要使用9oldAndroids进行向后兼容的动画,那么这确实是一个好方法 - 没有混乱的虚拟0长度动画,整洁而漂亮。 - sfThomas

15

编辑 - 下面的示例适用于Android SDK11之前,但我刚刚发现了一个非常棒的库,名为Nine Old Androids。它的神奇之处在于可以使得所有API版本的Android都能够使用Android 3.0的所有动画功能!!!

以前的回答

当我想要在复杂的布局上动态设置alpha时,我遇到了这种问题。 我创建了onSetAlpha()的重写,并添加了另一个递归函数,检查每种类型的视图的背景图像、可绘制对象和文本颜色。

    @Override
public boolean onSetAlpha(int alpha)
{
    return onSetAlpha(alpha, theLayoutYouWantToSetAlphaTo);
}

public boolean onSetAlpha(int alpha, View view)
{
    if (view instanceof ViewGroup)
    {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
        {
            onSetAlpha(alpha, ((ViewGroup) view).getChildAt(i));
            if (((ViewGroup) view).getBackground() != null) ((ViewGroup) view).getBackground().setAlpha(alpha);
        }
    }
    else if (view instanceof ImageView)
    {
        if (((ImageView) view).getDrawable() != null) ((ImageView) view).getDrawable().setAlpha(alpha);
        if (((ImageView) view).getBackground() != null) ((ImageView) view).getBackground().setAlpha(alpha);
    }
    else if (view instanceof TextView)
    {
        ((TextView) view).setTextColor(((TextView) view).getTextColors().withAlpha(alpha));
        if (((TextView) view).getBackground() != null) ((TextView) view).getBackground().setAlpha(alpha);
    }
    else if (view instanceof EditText)
    {
        ((EditText) view).setTextColor(((EditText) view).getTextColors().withAlpha(alpha));
        if (((EditText) view).getBackground() != null) ((EditText) view).getBackground().setAlpha(alpha);
    }
    return true;
}

您可以根据需要添加其他类型的视图。


3
很遗憾,你不能使用 nineoldandroids 方法。如果你尝试像这样执行操作 ObjectAnimator.ofFloat(myview, "alpha", 0.1f, 0.0f).setDuration(10).start();,它只会显示“无法找到 myview 的 float 类型的 alpha 属性的 setter 方法”。 - Timmmm
1
你尝试过查看这个吗?http://jakewharton.com/advanced-pre-honeycomb-animation/ - Martin Rajniak
你的参数 int alpha 的范围是闭区间 [0, 255],而不是 [0.0f, 1.0f],对吗? - SilentKnight

9

您可以扩展视图的draw()方法,并使用canvas.saveAlphaLayer()

public void draw(Canvas canvas) {
    canvas.saveLayerAlpha(null, alphaValue, ALL_SAVE_FLAG);
    super.draw(canvas);
    canvas.restore();
}

1
这个解决方案比我的好,我用的是那个而不是我上面建议的。 - Rotemmiz
对我来说,只有在删除最后一行 canvas.restore(); 后才能正常工作。也许是因为我正在从父视图进行一些子变换。 - olivier_sdg
必须删除最后一行:canvas.restore(); 否则完美运行。 - Eric Schlenz

0

您可以将Alpha设置为视图的所有颜色(例如按钮的文本或视图组的子视图)。将它们制作成颜色xml并在所有视图中使用。

您可以递归地从视图中读取颜色,添加Alpha并将其设置回去。

您可以将该视图创建为新活动的主视图。然后按照如何在Android上创建透明活动?中的步骤进行操作。


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