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


211

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

<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),但它给了我一个错误。

Answers:


64

我刚刚在遇到与TextView类似的问题时发现了您的问题。我可以通过扩展TextView和overrideing解决它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;
  }
}

12
谢谢,这对我也有帮助。但是,使用TextView和ImageView设置Alpha的方法不同是荒谬的。
Geraldo Nascimento 2010年

这也帮助我在没有第二资源的情况下将点击效果应用于图像视图。谢谢!!
skygeek

568

我被其他人的惊讶MUCH更复杂的答案。

XML格式

您可以非常简单地在xml中按钮(或任何其他视图)的颜色定义中定义Alpha:

android:color="#66FF0000"    // Partially transparent red

在上面的示例中,颜色将是部分透明的红色。

定义视图的颜色时,格式可以为#RRGGBB#AARRGGBB,其中AA为十六进制alpha值。FF将完全不透明,并且00将完全透明。

动态地

如果需要动态更改代码中的不透明度,请使用

myButton.getBackground().setAlpha(128);  // 50% transparent

INT的范围从0(完全透明)到255(完全不透明)。


18
这仍然是解决不了问题,如果你有一种化合物可绘制
米哈尔ķ

6
设置视图的半透明绿色:<RelativeLayout android:background =“#8700FF00” />
Jonny

2
视图没有android:color属性。
罗尼2012年

6
@moshersan您可以在android:background属性本身中设置颜色!
Dheeraj Bhaskar 2013年

1
那是不正确的不background透明度不是view不透明度。在许多用例中并不等效
Jocky Doe

215

我想您可能已经找到了答案,但是如果没有找到答案(对于其他开发人员),则可以这样做:

btnMybutton.getBackground().setAlpha(45);

在这里,我将不透明度设置为45。您基本上可以将其设置为0(完全透明)到255(完全不透明)之间的任何值。


5
仅在API 11+ developer.android.com
Graeme,

8
您已经将@Graeme链接到View类的setAlpha方法,但是该帖子正在Drawable类上使用setAlpha。getBackground方法返回一个Drawable。这种方法是从API级别1 developer.android.com/reference/android/graphics/drawable/...
Geekygecko

真有趣!我没看到 这是否意味着即使背景设置为透明,文本也完全可见。
Graeme

-1在我的背景可绘制为选择器的情况下不起作用。
Mike S

3
这很好用,但有一个副作用:我有许多按钮共享相同的背景,并且它们都变得透明!:(
Mark

66

我建议您做的是在colors.xml文件中创建一个自定义ARGB颜色,例如:

<resources>
<color name="translucent_black">#80000000</color>
</resources>

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

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

如果要使用按钮的形状,您可以做的另一件事是创建一个Shape drawable资源,您可以在其中设置按钮应具有的属性:

文件: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%的不透明度转换为十六进制值,则可以使用google搜索“ 255的40%转换为十六进制”,得出40%的十六进制值
scottyab

54

根据android docs视图,alpha是介于0和1之间的值。因此要设置它,请使用以下代码:

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

那只是对我来说适用于整个视图的原因...我尝试了listview项目,它也具有多个textviews。这条单行有助于在视图及其子级上设置Alpha。感谢@ cange1
Alyas

唯一对我也有用的东西。我知道这很旧了,但是谢谢@ cange1
masoftheund


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

以上是我所知道的...我认为创建自定义按钮类是最好的主意

API级别11
最近,我遇到了这个android:alpha xml属性,该属性的值介于0和1之间。相应的方法是setAlpha(float)


嗨,乔斯尼丁。谢谢您的回复。但这使整个按钮完全透明。我正在寻找的是在按钮上添加一些不透明度(可能通过alpha值)。
ncakmak 2010年

它是一个浮点数,因此您可以使用介于0和1、0.5之间的值。
StackOverflowed

@StackOverflowed-我相信ncakmak是第一个解决方案。设置@android:color/transparent为Background确实可以使视图完全透明。本@android:alpha-部分似乎是一个附录。
katzenhut

17

尽管这btnMybutton.getBackground().setAlpha(45);是个好主意,但它仅将Alpha应用于背景而不是整个视图。

如果要应用Alpha进行查看,请btnMybutton.setAlpha(0.30f);改用。这将不透明度应用于视图。它接受0到1之间的值。

Doc说:

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


7

我在ICS / JB中遇到了这个问题,因为Holo主题的默认按钮由稍微透明的图像组成。对于背景来说,这尤其明显。

姜饼与ICS +:

姜饼 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>
.
.
.

但是,这会导致出现白色边框,因为“全息”按钮图像包含用于说明按下空间的边距:

白色太多 白色压得太多

因此,解决方案是给白色背景留出一定的边距(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按钮后面的这种确切样式会导致按钮下方出现少量白色)。


7

对于视图,您可以通过以下方式设置不透明度。

view_name.setAlpha(float_value);

view.setAlpha(int)对于大于11的API版本,不推荐使用该属性。从此以后,.setAlpha(0.5f)将使用like属性。


6

对于TextView color的API <11,我执行了以下操作:

int textViewColor = textView.getTextColors().getDefaultColor(); 
textView.setTextColor(Color.argb(128, Color.red(textViewColor), Color.green(textViewColor), Color.blue(textViewColor))); //50% transparent

有点麻烦,但是,它可以工作:-)


1

我知道这已经有了很多答案,但是我发现对于按钮,创建自己的.xml选择器并将其设置为上述按钮的背景是最简单的。这样,您还可以在按下或启用它时更改其状态,等等。这是我使用的一个简短摘要。如果要为任何颜色添加透明度,请添加前导十六进制值(#XXcccccc)。(XX ==“颜色的Alpha”)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#70c656" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#70c656"
                android:endColor="#53933f"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.