How to Set Opacity (Alpha) for View in Android

2019-01-01 14:19发布

问题:

I have a button as in the following:

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

In my onCreate() event, I am calling Button01 like this:

setContentView(R.layout.main);

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

There is a background in the application, and I want to set an opacity on this submit button. How can I set an opacity for this view? Is it something that I can set on the java side, or can I set in the main.xml file?

On the java side I tried Button01.mutate().SetAlpha(100), but it gave me an error.

回答1:

I just found your question while having the similar problem with a TextView. I was able to solve it, by extending TextView and overriding onSetAlpha. Maybe you could try something similar with your button:

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;
  }
}


回答2:

I\'m amazed by everyone else\'s MUCH more complicated answers.

XML

You can very simply define the alpha in the color definition of the button (or any other view) in your xml:

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

In the above example, the color would be a partially transparent red.

When defining the color of a view, the format can be either #RRGGBB or #AARRGGBB, where AA is the hex alpha value. FF would be fully opaque and 00 would be full transparent.

Dynamically

If you need to dynamically alter the opacity in your code, use

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

Where the INT ranges from 0 (fully transparent) to 255 (fully opaque).



回答3:

I guess you may have already found the answer, but if not (and for other developers), you can do it like this:

btnMybutton.getBackground().setAlpha(45);

Here I have set the opacity to 45. You can basically set it from anything between 0(fully transparent) to 255 (completely opaque)



回答4:

What I would suggest you do is create a custom ARGB color in your colors.xml file such as :

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

then set your button background to that color :

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

Another thing you can do if you want to play around with the shape of the button is to create a Shape drawable resource where you set up the properties what the button should look like :

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>

Then use that as the button background :

    android:background=\"@drawable/rounded_corner_box\"


回答5:

According to the android docs view alpha is a value between 0 and 1. So to set it use something like this:

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


回答6:

Much more easier from the above. Default alpha attribute is there for button

android:alpha=\"0.5\"

The range is between 0 for complete transparent and 1 for complete opacity.



回答7:

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

The above is something that I know... I think creating a custom button class is the best idea

API Level 11
Recently I came across this android:alpha xml attribute which takes a value between 0 and 1. The corresponding method is setAlpha(float).



回答8:

Although btnMybutton.getBackground().setAlpha(45); is nice idea, it just apply alpha to background and not the whole view.

If you want apply alpha to view use btnMybutton.setAlpha(0.30f); instead. This apply opacity to View. It accepts a value between 0 and 1.

Doc says:

Sets the opacity of the view. This is a value from 0 to 1, where 0 means the view is completely transparent and 1 means the view is completely opaque. If this view overrides onSetAlpha(int) to return true, then this view is responsible for applying the opacity itself. Otherwise, calling this method is equivalent to calling setLayerType(int, android.graphics.Paint) and setting a hardware layer. Note that setting alpha to a translucent value (0 < alpha < 1) may have performance implications. It is generally best to use the alpha property sparingly and transiently, as in the case of fading animations.



回答9:

I\'ve run into this problem with ICS/JB because the default buttons for the Holo theme consist of images that are slightly transparent. For a background this is especially noticeable.

Gingerbread vs. ICS+:

\"Gingerbread\" \"ICS\"

Copying over all of the drawable states and images for each resolution and making the transparent images solid is a pain, so I\'ve opted for a dirtier solution: wrap the button in a holder that has a white background. Here\'s a crude XML drawable (ButtonHolder) which does exactly that:

Your XML file

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

However, this results in a white border because the Holo button images include margins to account for the pressed space:

\"Too \"Too

So the solution is to give the white background a margin (4dp worked for me) and rounded corners (2dp) to completely hide the white yet make the button solid:

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>

The final result looks like this:

\"No \"No

You should target this style for v14+, and tweak or exclude it for Gingerbread/Honeycomb because their native button image sizes are different from ICS and JB\'s (e.g. this exact style behind a Gingerbread button results in a small bit of white below the button).



回答10:

For API < 11 for textView color I did the following:

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

A little cumbersome, but hey, it works :-)



回答11:

For a view you can set opacity by the following.

view_name.setAlpha(float_value);

The property view.setAlpha(int) is deprecated for the API version greater than 11. Henceforth, property like .setAlpha(0.5f) is used.



回答12:

I know this already has a bunch of answers but I found that for buttons it is just easiest to create your own .xml selectors and set that to the background of said button. That way you can also change it state when pressed or enabled and so on. Here is a quick snippet of one that I use. If you want to add a transparency to any of the colors, add a leading hex value (#XXcccccc). (XX == \"alpha of color\")

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