如何在Android中设置视图的不透明度(Alpha)

245

我有一个按钮,如下所示:

<Button 
     android:text="Submit" 
     android:id="@+id/Button01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content">
</Button>

在我的onCreate()事件中,我这样调用Button01:

setContentView(R.layout.main);

View Button01 = this.findViewById(R.id.Button01);
Button01.setOnClickListener(this);

应用程序中有一个背景,我想将这个提交按钮设置为一个不透明度。我该如何在这个视图上设置一个不透明度?我可以在Java端设置,还是可以在main.xml文件中设置?

在Java端,我尝试使用 Button01.mutate().SetAlpha(100),但是出现了错误。

13个回答

605

看到其他人写的复杂答案,我感到很惊讶。

XML

在 XML 中,你可以非常简单地定义按钮(或任何其他视图)颜色定义中的alpha值:

android:color="#66FF0000"    // Partially transparent red
在上面的示例中,颜色将是部分透明的红色。
在定义视图的颜色时,格式可以是#RRGGBB#AARRGGBB,其中AA是十六进制的 alpha 值。 FF 将完全不透明,00 将完全透明。
动态更改代码中的不透明度,可以使用:
myButton.getBackground().setAlpha(128);  // 50% transparent

透明度的取值范围为 0(完全透明)到 255(完全不透明)。


20
如果您有复合图标,这仍然不是解决方案。 - Michał Klimczak
6
将视图的背景色设置为半透明绿色: <RelativeLayout android:background="#8700FF00"/> - Jonny
2
视图(View)没有android:color属性。 - Ron
6
你可以在 android:background 属性中直接设置颜色! - Dheeraj Bhaskar
3
这是不正确的,background 不透明度并不等同于 view 的不透明度,在许多情况下都是不同的。 - Jocky Doe
显示剩余4条评论

228

我猜你可能已经找到了答案,但是如果没有(或者为其他开发者),你可以这样做:

btnMybutton.getBackground().setAlpha(45);

我已将透明度设置为45。你可以将其设置在0(完全透明)到255 (完全不透明)之间的任何值。


5
仅适用于API 11及以上版本:https://developer.android.com/reference/android/view/View.html#setAlpha(float) - Graeme
9
@Graeme,您提供了View类中的setAlpha方法链接,但是此文章使用Drawable类中的setAlpha。getBackground方法返回一个Drawable对象。该方法可在API Level 1中使用。https://developer.android.com/reference/android/graphics/drawable/Drawable.html#setAlpha(int) - Geekygecko
哦,有趣!我没注意到。这是否意味着即使背景设置为透明,文本仍然完全可见? - Graeme
-1 在我的情况下不起作用,因为我的背景可绘制是一个选择器。 - Mike S
3
这个很有效,但是有一个副作用:我有许多按钮共享相同的背景,并且它们都变成透明的!:( - Mark
@Mark 你说得对,你知道如何解决这个副作用吗?我尝试使用不同的名称克隆相同的背景(它是一个颜色资源),但它没有起作用..!? - Alaa AbuZarifa

88

从上面来看,更加容易。

默认的alpha属性适用于按钮。

android:alpha="0.5"

透明度的范围是从0表示完全透明到1表示完全不透明。


当我这样做时,我会得到一个编译错误:“aapt.v2.Aapt2Exception:Android资源链接失败”。 - IgorGanapolsky

67
我建议您在colors.xml文件中创建一个自定义的ARGB color,例如:
<resources>
<color name="translucent_black">#80000000</color>
</resources>

然后将您的按钮背景设置为该颜色:

android:background="@android:color/translucent_black"

如果你想玩弄按钮的形状,另一件可以做的事情是创建一个Shape drawable resource,在其中设置按钮应该看起来像什么:

文件:res/drawable/rounded_corner_box.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#80000000"
        android:endColor="#80FFFFFF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

然后将其用作按钮的背景:

    android:background="@drawable/rounded_corner_box"

6
如果你不知道如何将40%的透明度转换成十六进制值,可以使用谷歌搜索“40% of 255 to hex”,这将给出40%的十六进制值。 - scottyab

65

我在遇到TextView类似的问题时,偶然看到了你的问题。通过扩展TextView并覆盖onSetAlpha方法,我成功地解决了它。也许你可以尝试使用类似的方式解决你的按钮问题:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class AlphaTextView extends TextView {

  public AlphaTextView(Context context) {
    super(context);
  }

  public AlphaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public AlphaTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public boolean onSetAlpha(int alpha) {
    setTextColor(getTextColors().withAlpha(alpha));
    setHintTextColor(getHintTextColors().withAlpha(alpha));
    setLinkTextColor(getLinkTextColors().withAlpha(alpha));
    return true;
  }
}

14
谢谢,这也对我有帮助。然而,一个TextView和一个ImageView在设置透明度时有不同的方法,这太荒谬了。 - Geraldo Nascimento
这对我也很有帮助,可以在图像视图上应用点击效果而无需第二个资源。谢谢!! - skygeek

62

根据 Android 文档,视图透明度是介于 0 和 1 之间的值。因此,要进行设置,请使用类似以下的代码:

View v;
v.setAlpha(.5f);

这是我在整个视图中唯一有效的方法... 我尝试了列表项,其中还有多个文本视图。 这一行代码帮助设置视图及其子项的alpha值。感谢@cange1 - Alyas
这对我也是唯一有效的办法。我知道这篇文章有点老,但还是要感谢@cange1。 - Francis Saa-Dittoh

19
android:background="@android:color/transparent"

我知道以上内容......我认为创建自定义按钮类是最好的想法。

API Level 11
最近我发现了这个android:alpha XML 属性,它接受介于0和1之间的值。对应的方法是 setAlpha(float)


1
嗨,Josnidhin。感谢您的回复。但是它会使整个按钮完全透明。我想要的是在按钮上设置一些不透明度(可能通过 alpha 值)。 - ncakmak
它是一个浮点数,因此您可以使用0到1之间的值,例如0.5。 - StackOverflowed
@StackOverflowed - 我相信ncakmak指的是第一种解决方案。将@android:color/transparent设置为背景确实会使视图完全透明。@android:alpha部分似乎是一个附加说明。 - katzenhut

18

虽然btnMybutton.getBackground().setAlpha(45);是一个好的想法,但它仅应用于背景而非整个视图。

如果您想要对视图应用透明度,请改用btnMybutton.setAlpha(0.30f);。这将为View应用不透明度。它接受介于0和1之间的值。

文档说明:

设置视图的不透明度。这是一个从0到1的值,其中0表示视图完全透明,而1表示视图完全不透明。如果此视图覆盖了onSetAlpha(int)以返回true,则此视图负责自己应用不透明度。否则,调用此方法等效于调用setLayerType(int,android.graphics.Paint)并设置硬件层。请注意,将alpha设置为半透明值(0 < alpha < 1)可能会影响性能。通常最好仅短暂地和节制地使用alpha属性,例如在淡入淡出动画中使用。


12

要设置视图的透明度,请按照以下方式操作。

view_name.setAlpha(float_value);

view.setAlpha(int)属性在API版本11以上已被弃用。从现在开始,请使用.setAlpha(0.5f)属性。


这是正确的答案。只需将高度设置为1dp即可使其看起来更加粗壮。 - chitgoks

7
我在ICS / JB中遇到了这个问题,因为Holo主题的默认按钮由略微透明的图像组成。对于背景来说,这尤其明显。
Gingerbread与ICS +:
复制每个分辨率的所有可绘制状态和图像,并使透明图像变为实心是很麻烦的,因此我选择了一个更简单的解决方案:将按钮包装在具有白色背景的容器中。 这里有一个粗略的XML drawable(ButtonHolder),可以完美地实现这一点:
您的XML文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              style="@style/Content">
  <RelativeLayout style="@style/ButtonHolder">
      <Button android:id="@+id/myButton"
              style="@style/Button"
              android:text="@string/proceed"/>
    </RelativeLayout>
</LinearLayout>

ButtonHolder.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
    </shape>
  </item>

</layer-list>

styles.xml

.
.
.      
  <style name="ButtonHolder">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:background">@drawable/buttonholder</item>
  </style>

  <style name="Button" parent="@android:style/Widget.Button">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textStyle">bold</item>
  </style>
.
.
.

然而,这会导致白色边框,因为Holo按钮图像包含边距以考虑按下空间:
所以解决方案是给白色背景加上一个边距(4dp适用于我),并添加圆角(2dp)以完全隐藏白色,并使按钮变得实心:
ButtonHolder.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

  <item>
    <shape android:shape="rectangle">
      <solid android:color="@android:color/transparent"/>
    </shape>
  </item>

  <item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp">
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
      <corners android:radius="2dp" />
    </shape>
  </item>

</layer-list>

最终效果如下:

无白色 无白色按下

您应该针对 v14+ 的样式进行调整,而对 Gingerbread/Honeycomb 进行调整或排除,因为它们的本地按钮图像尺寸与 ICS 和 JB(例如,在 Gingerbread 按钮后面使用这个确切样式会导致按钮下方留有一小块白色)不同。

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