【问题标题】:How to Set Opacity (Alpha) for View in Android如何在 Android 中为视图设置不透明度(Alpha)
【发布时间】:2011-02-19 19:01:09
【问题描述】:

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

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

【问题讨论】:

    标签: android button view opacity


    【解决方案1】:

    其他人的更多更复杂的答案让我感到惊讶。

    XML

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

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

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

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

    动态

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

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

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

    【讨论】:

    • 如果您有复合可绘制对象,这仍然不是解决方案
    • 设置半透明绿色视图:
    • 视图没有android:color 属性。
    • @moshersan 您可以在 android:background 属性本身中设置颜色!
    • 这是不正确的background opacity 不是view opacity。在许多用例中不等效
    【解决方案2】:

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

    btnMybutton.getBackground().setAlpha(45);
    

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

    【讨论】:

    • @Graeme 您已链接到 View 类的 setAlpha 方法,但帖子使用的是 Drawable 类的 setAlpha。 getBackground 方法返回一个 Drawable。此方法来自 API 级别 1。developer.android.com/reference/android/graphics/drawable/…
    • 哦,有趣!我没看到。这是否意味着即使背景设置为透明,文本也是完全可见的。
    • -1 这在我的背景可绘制对象是选择器的情况下不起作用。
    • 这很好用,但有一个副作用:我有许多按钮共享相同的背景,它们变得全透明! :(
    【解决方案3】:

    从上面更容易。 按钮有默认的 alpha 属性

    android:alpha="0.5"
    

    0 表示完全透明,1 表示完全不透明。

    【讨论】:

    • 这正是我想要的,很棒,在 api 21 上测试过
    • 完美答案!!
    【解决方案4】:

    我建议您在您的 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"
    

    【讨论】:

    • 如果您正在努力将不透明度从 40% 转换为十六进制值,您可以使用谷歌搜索“255 的 40% 到十六进制”给出 40% 的十六进制值
    【解决方案5】:

    我刚刚发现您的问题,同时遇到与 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;
      }
    }
    

    【讨论】:

    • 谢谢,这也帮助了我。然而,TextView 和 ImageView 有不同的方式来设置 alpha 是荒谬的。
    • 这也帮助我在没有第二资源的情况下对图像视图应用点击效果。谢谢!!
    【解决方案6】:

    根据 android 文档视图,alpha 是一个介于 0 和 1 之间的值。因此,要设置它,请使用以下内容:

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

    【讨论】:

    • 这对我来说只适用于整个视图...我已经尝试过列表视图项目,它也有多个文本视图。这条线有助于在视图及其子项上设置 alpha。谢谢@cange1
    • 唯一对我也有用的东西。我知道这是旧的,但感谢@cange1
    【解决方案7】:
    android:background="@android:color/transparent"
    

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

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

    【讨论】:

    • 嗨乔斯尼丁。感谢你的回复。但它使整个按钮完全透明。我正在寻找的是在按钮上添加一些不透明度(可能通过 alpha 值)。
    • 它是一个浮点数,因此您可以使用介于 0 和 1 之间的值,例如 0.5。
    • @StackOverflowed - 我相信 ncakmak 意味着第一个解决方案。将@android:color/transparent 设置为背景确实会使视图完全透明。 @android:alpha - 部分似乎是附录。
    【解决方案8】:

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

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

    文档说:

    设置视图的不透明度。这是一个从 0 到 1 的值,其中 0 表示视图是完全透明的,1 表示视图是 完全不透明。如果此视图覆盖 onSetAlpha(int) 以返回 是的,那么这个视图负责应用不透明度本身。 否则调用这个方法就相当于调用 setLayerType(int, android.graphics.Paint) 并设置硬件 层。请注意,将 alpha 设置为半透明值 (0

    【讨论】:

      【解决方案9】:

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

      view_name.setAlpha(float_value);
      

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

      【讨论】:

        【解决方案10】:

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

        姜饼与 ICS+:

        复制每个分辨率的所有可绘制状态和图像并使透明图像成为实体是一种痛苦,因此我选择了一个更脏的解决方案:将按钮包裹在具有白色背景的支架中。这是一个粗略的 XML 可绘制对象 (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 按钮后面的这种确切样式会导致下方有一点白色按钮)。

        【讨论】:

          【解决方案11】:

          对于 textView 颜色的 API

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

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

          【讨论】:

            【解决方案12】:

            如果你使用 Kotlin ,像这样设置 alpha 非常容易

            imageView.alpha= 0.5F
            

            其中值必须是浮点数

            【讨论】:

              【解决方案13】:

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

              <?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>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-04-04
                • 1970-01-01
                • 2011-07-02
                • 2012-02-04
                • 2011-04-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多