web-dev-qa-db-fra.com

Comment définir l'opacité (alpha) de la vue dans Android

J'ai un bouton comme dans ce qui suit:

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

Dans mon événement onCreate(), j'appelle Button01 comme suit:

setContentView(R.layout.main);

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

Il y a un arrière-plan dans l'application et je souhaite définir une opacité sur ce bouton d'envoi. Comment définir une opacité pour cette vue? Est-ce quelque chose que je peux définir du côté Java ou puis-je le définir dans le fichier main.xml?

Du côté Java, j'ai essayé Button01.mutate().SetAlpha(100), mais cela m'a causé une erreur.

195
ncakmak

Je viens de trouver votre question tout en ayant le même problème avec un TextView. J'ai pu résoudre ce problème en développant TextView et en remplaçant onSetAlpha. Peut-être que vous pourriez essayer quelque chose de similaire avec votre bouton:

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

Je suis émerveillé par les réponses beaucoup plus compliquées _ de tous les autres .

XML

Vous pouvez très simplement définir l'alpha dans la définition de la couleur du bouton (ou de toute autre vue) dans votre code xml:

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

Dans l'exemple ci-dessus, la couleur serait un rouge partiellement transparent.

Lors de la définition de la couleur d'une vue, le format peut être soit #RRGGBB, soit #AARRGGBB, où AA est la valeur hexadécimale alpha. FF serait complètement opaque et 00 serait complètement transparent.

Dynamiquement

Si vous devez modifier dynamiquement l'opacité dans votre code, utilisez

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

Où INT varie de 0 (totalement transparent) à 255 (totalement opaque).

554
Jake Wilson

Je suppose que vous avez peut-être déjà trouvé la réponse, mais si ce n’est pas le cas (et pour les autres développeurs), vous pouvez le faire comme ceci:

btnMybutton.getBackground().setAlpha(45);

Ici, j'ai défini l'opacité sur 45. Vous pouvez le définir entre n'importe quoi entre (totalement transparent) et 255 (complètement opaque)

209
abhi

Ce que je vous suggère de faire est de créer un fichier personnalisé couleur ARGB dans votre fichier colors.xml, tel que:

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

puis définissez l’arrière-plan de votre bouton sur cette couleur:

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

Une autre chose que vous pouvez faire si vous voulez jouer avec la forme du bouton est de créer un ressource pouvant être dessinée par une forme où vous définissez les propriétés à quoi le bouton devrait ressembler:

fichier: 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>

Ensuite, utilisez-le comme arrière-plan du bouton:

    Android:background="@drawable/rounded_corner_box"
67
Akos Cz

Selon l'alpha de la vue Android _, la valeur alpha est une valeur comprise entre 0 et 1. Donc, pour le définir, utilisez quelque chose comme ceci:

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

Beaucoup plus facile de ce qui précède. L'attribut alpha par défaut est là pour le bouton

Android:alpha="0.5"

La plage est comprise entre 0 pour une transparence complète et 1 pour une opacité complète.

40
Raja Jawahar
Android:background="@Android:color/transparent"

Ce qui précède est quelque chose que je sais ... Je pense que la meilleure idée est de créer une classe de boutons personnalisée.

API niveau 11
Récemment, j’ai rencontré cet attribut Android: alpha xml qui prend une valeur comprise entre 0 et 1. La méthode correspondante est setAlpha (float) .

19
Josnidhin

Bien que btnMybutton.getBackground().setAlpha(45); soit une bonne idée, elle applique simplement l'alpha à l'arrière-plan et non à la vue entière.

Si vous souhaitez appliquer alpha à l'affichage, utilisez plutôt btnMybutton.setAlpha(0.30f);. Ceci applique l'opacité à la vue. Il accepte une valeur comprise entre 0 et 1.

Doc dit:

Définit l'opacité de la vue. Il s’agit d’une valeur comprise entre 0 et 1, où 0 signifie que la vue est complètement transparente et 1, que la vue est complètement opaque. Si cette vue remplace onSetAlpha (int) pour renvoyer true, cette vue est chargée d'appliquer l'opacité elle-même. Sinon, l'appel de cette méthode équivaut à appeler setLayerType (int, Android.graphics.Paint) et à définir une couche matérielle. Notez que définir alpha sur une valeur translucide (0 <alpha <1) peut avoir des conséquences sur les performances. Il est généralement préférable d'utiliser la propriété alpha avec modération et de manière transitoire, comme dans le cas des animations en fondu.

14
Hesam

J'ai rencontré ce problème avec ICS/JB car les boutons par défaut du thème Holo consistent en des images légèrement transparentes. Pour un fond cela est particulièrement remarquable.

pain d'épices contre ICS +:

GingerbreadICS

Copier tous les états et toutes les images pouvant être dessinés pour chaque résolution et rendre les images transparentes solides est une tâche difficile. J'ai donc opté pour une solution plus sale: placer le bouton dans un support doté d'un fond blanc. Voici un XML brut pouvant être dessiné (ButtonHolder) qui fait exactement cela:

Votre fichier 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>
.
.
.

Toutefois, cela entraîne une bordure blanche car les images du bouton Holo incluent des marges pour tenir compte de l'espace pressé:

Too much whiteToo much white pressed

La solution est donc de donner au fond blanc une marge (4dp travaillée pour moi) et des coins arrondis (2dp) pour masquer complètement le blanc tout en rendant le bouton solide:

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>

Le résultat final ressemble à ceci:

No whiteNo white pressed

Vous devez cibler ce style pour v14 + et modifier ou l'exclure pour Gingerbread/Honeycomb car leurs tailles d'image de bouton natives diffèrent de ICS et de JB (par exemple, le style exact situé derrière un bouton Gingerbread entraîne un petit blanc sous le bouton).

8
annie

Pour une vue, vous pouvez définir l'opacité comme suit.

view_name.setAlpha(float_value);

La propriété view.setAlpha(int) est obsolète pour la version de l'API supérieure à 11. Désormais, une propriété comme .setAlpha(0.5f) est utilisée.

6
Palash Dange

Pour l'API <11 pour la couleur textView, j'ai procédé comme suit:

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

Un peu encombrant, mais bon, ça marche :-)

5
EZDsIt

Je sais que cela a déjà un tas de réponses, mais j’ai trouvé que pour les boutons, il est tout simplement plus facile de créer vos propres sélecteurs .xml et de le définir à l’arrière-plan dudit bouton. De cette façon, vous pouvez également changer l'état lorsque vous appuyez sur ou activé, etc. Voici un extrait de celui que j’utilise. Si vous souhaitez ajouter une transparence à l'une des couleurs, ajoutez une valeur hexadécimale (#XXcccccc). (XX == "alpha de couleur")

<?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>
2
Konrad Winkowski