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

How can I change the transparency (alpha) of a view on pre-SDK-11 on Android?

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

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


尝试使用AlphaAnimation:http://developer.android.com/reference/android/view/animation/AlphaAnimation.html

/ *必须使用动画才能让卡片褪色。 * /

1
2
3
4
AlphaAnimation alpha = new AlphaAnimation(0.7F, 0.7F);
alpha.setDuration(0); // Make animation instant
alpha.setFillAfter(true); // Tell it to persist after the animation ends
view.startAnimation(alpha);


NineOldAndroids的ViewHelper是我使用的,它是一个静态助手类和一个真正的宝石!许多人在这里推荐NineOldAndroids,但我没有看到ViewHelper。它真的很容易使用。

1
2
3
4
import com.nineoldandroids.view.ViewHelper;
...

ViewHelper.setAlpha(myView, .2f);

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


编辑 - 以下示例涉及Android pre-SDK11,但我刚刚发现了一个名为Nine Old Androids的非常棒的图书馆,它所做的惊人的事情是为所有API版本启用Android 3.0的所有动画功能!

以前的答案

我想在复杂的布局上动态设置alpha时遇到这种问题。
我创建了一个onSetAlpha()的覆盖,并添加了另一个递归函数,它检查每种视图的背景图像,drawables和文本颜色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    @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;
}

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


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

1
2
3
4
5
public void draw(Canvas canvas) {
    canvas.saveLayerAlpha(null, alphaValue, ALL_SAVE_FLAG);
    super.draw(canvas);
    canvas.restore();
}


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

您可以递归地从视图中读取颜色并为其添加alpha并将其设置回来。

您可以将视图创建为新活动的主视图。然后像我如何在Android上创建透明活动一样?