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

nca*_*mak 197 android view button opacity

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

<Button 
     android:text="Submit" 
     android:id="@+id/Button01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content">
</Button>
Run Code Online (Sandbox Code Playgroud)

在我的onCreate()活动中,我这样调用Button01:

setContentView(R.layout.main);

View Button01 = this.findViewById(R.id.Button01);
Button01.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)

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

在java方面,我试过Button01.mutate().SetAlpha(100),但它给了我一个错误.

Jak*_*son 555

我对每个人都感到惊讶别人的MUCH更复杂的答案.

XML

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

android:color="#66FF0000"    // Partially transparent red
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,颜色是部分透明的红色.

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

动态

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

myButton.getBackground().setAlpha(128);  // 50% transparent
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你有一个复合drawable,这仍然不是解决方案 (17认同)
  • 设置半透明绿色视图:<RelativeLayout android:background ="#8700FF00"/> (6认同)
  • @moshersan您可以在android:background属性中设置颜色! (6认同)
  • View没有`android:color`属性. (2认同)
  • 那是不正确的“背景”不透明度不是“视图”不透明度。在许多用例中并不等效 (2认同)

小智 210

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

btnMybutton.getBackground().setAlpha(45);
Run Code Online (Sandbox Code Playgroud)

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

  • @Graeme你已经链接到View类的setAlpha方法,但帖子是在Drawable类上使用setAlpha.getBackground方法返回一个Drawable.此方法来自API级别1. https://developer.android.com/reference/android/graphics/drawable/Drawable.html#setAlpha(int) (8认同)
  • 这仅适用于API 11+ https://developer.android.com/reference/android/view/View.html#setAlpha(float) (5认同)
  • 这很有效,但有一个副作用:我有许多按钮共享相同的背景,他们变得透明!:( (3认同)

Ako*_* Cz 67

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

<resources>
<color name="translucent_black">#80000000</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

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

android:background="@android:color/translucent_black"
Run Code Online (Sandbox Code Playgroud)

如果你想要使用按钮的形状,你可以做的另一件事是创建一个Shape drawable资源,你可以在其中设置按钮应该是什么样的属性:

file: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>
Run Code Online (Sandbox Code Playgroud)

然后使用它作为按钮背景:

    android:background="@drawable/rounded_corner_box"
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在努力将40%的不透明度转换为十六进制值,你可以使用谷歌搜索"40%的255到十六进制"给出16%的十六进制值 (6认同)

RoT*_*oRa 60

我刚发现你的问题,同时遇到与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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这也对我有所帮助.然而,TextView和ImageView有不同的设置alpha的方法是荒谬的. (12认同)

小智 47

根据android docs视图,alpha是0到1之间的值.所以要设置它使用这样的东西:

View v;
v.setAlpha(.5f);
Run Code Online (Sandbox Code Playgroud)


Raj*_*har 41

从上面来看,更容易.默认的alpha属性用于按钮

android:alpha="0.5"
Run Code Online (Sandbox Code Playgroud)

范围介于0表示完全透明,1表示完全不透明.


Jos*_*hin 19

android:background="@android:color/transparent"
Run Code Online (Sandbox Code Playgroud)

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

API等级11
最近我遇到了这个android:alpha xml属性,它取0到1之间的值.相应的方法是setAlpha(float).


Hes*_*sam 14

虽然btnMybutton.getBackground().setAlpha(45);很不错,但它只是将alpha应用于背景而不是整个视图.

如果您想要应用alpha来查看使用btnMybutton.setAlpha(0.30f);.这会将不透明度应用于View.它接受0到1之间的值.

Doc说:

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


ann*_*nie 8

我用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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
.
.
.
Run Code Online (Sandbox Code Playgroud)

但是,这会产生白色边框,因为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>
Run Code Online (Sandbox Code Playgroud)

最终结果如下:

没有白色 没有白了

您应该将此样式定位为v14 +,并为Gingerbread/Honeycomb调整或排除它,因为它们的原始按钮图像大小与ICS和JB不同(例如,姜饼按钮后面的这种确切样式会在按钮下方产生一点点白色).


Mor*_*ori 8

如果你使用Kotlin,那么设置 alpha 像这样很容易

imageView.alpha= 0.5F
Run Code Online (Sandbox Code Playgroud)

其中值必须是浮点数


小智 6

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

view_name.setAlpha(float_value);
Run Code Online (Sandbox Code Playgroud)

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


EZD*_*sIt 5

对于textView颜色的API <11,我执行了以下操作:

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

有点麻烦,但嘿,它的工作原理:-)