Come impostare l'opacità (alfa) per la visualizzazione in Android


211

Ho un pulsante come nel seguente:

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

Nel mio onCreate()evento, sto chiamando Button01 in questo modo:

setContentView(R.layout.main);

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

C'è uno sfondo nell'applicazione e voglio impostare un'opacità su questo pulsante di invio. Come posso impostare un'opacità per questa vista? È qualcosa che posso impostare sul lato Java o posso impostare nel file main.xml?

Sul lato java ho provato Button01.mutate().SetAlpha(100), ma mi ha dato un errore.

Risposte:


64

Ho appena trovato la tua domanda pur avendo il problema simile con un TextView. Sono stato in grado di risolverlo, estendendo TextView e sovrascrivendolo onSetAlpha. Forse potresti provare qualcosa di simile con il tuo pulsante:

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
Grazie, anche questo mi ha aiutato. Tuttavia è ridicolo che un TextView e un ImageView abbiano diversi modi per impostare l'alfa.
Geraldo Nascimento,

Questo mi ha aiutato anche ad applicare l'effetto clic sulla visualizzazione dell'immagine senza seconda risorsa. Grazie !!
skygeek

568

Sono stupito dalle risposte MOLTO più complicate di tutti gli altri .

XML

Puoi semplicemente definire l'alfa nella definizione del colore del pulsante (o di qualsiasi altra vista) nel tuo XML:

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

Nell'esempio sopra, il colore sarebbe un rosso parzialmente trasparente.

Quando si definisce il colore di una vista, il formato può essere uno #RRGGBBo #AARRGGBB, dove si AAtrova il valore alfa esadecimale. FFsarebbe completamente opaco e 00sarebbe completamente trasparente.

dinamicamente

Se è necessario modificare dinamicamente l'opacità nel codice, utilizzare

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

Dove INT varia da 0(completamente trasparente) a 255(completamente opaco).


18
Questa non è ancora la soluzione se si dispone di un disegno estraibile composto
Michał K

6
Imposta mezzo colore verde trasparente della vista: <RelativeLayout android: background = "# 8700FF00" />
Jonny

2
La vista non ha android:colorattributo.
Ronnie,

6
@moshersan Puoi impostare il colore nell'androide: la proprietà stessa dello sfondo!
Dheeraj Bhaskar,

1
Questa è backgroundun'opacità errata non è viewun'opacità. Non equivalente in molti casi d'uso
Jocky Doe,

215

Immagino che tu abbia già trovato la risposta, ma in caso contrario (e per altri sviluppatori), puoi farlo in questo modo:

btnMybutton.getBackground().setAlpha(45);

Qui ho impostato l'opacità su 45. In pratica è possibile impostarla da qualsiasi valore compreso tra 0 (completamente trasparente) e 255 (completamente opaco)


5
Questo è disponibile solo su API 11+ developer.android.com/reference/android/view/…
Graeme,

8
@Graeme hai collegato al metodo setAlpha nella classe View, ma il post utilizza setAlpha nella classe Drawable. Il metodo getBackground restituisce un Drawable. Questo metodo proviene dal livello API 1. developer.android.com/reference/android/graphics/drawable/…
Geekygecko

Oh interessante! Non l'ho visto. Ciò significherebbe che il testo era completamente visibile anche se lo sfondo era impostato su trasparente.
Graeme,

-1 questo non funziona nel mio caso in cui il mio disegno di sfondo è un selettore.
Mike S,

3
funziona alla grande ma con un effetto collaterale: ho molti pulsanti che condividono lo stesso sfondo e diventano tutti trasparenti! :(
Segna il

66

Quello che ti suggerirei di fare è creare un colore ARGB personalizzato nel tuo file colors.xml come:

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

quindi imposta lo sfondo del pulsante su quel colore:

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

Un'altra cosa che puoi fare se vuoi giocare con la forma del pulsante è creare una risorsa disegnabile Shape dove imposti le proprietà come dovrebbe apparire il pulsante:

file: res / drawable / arrotondato_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>

Quindi usalo come sfondo del pulsante:

    android:background="@drawable/rounded_corner_box"

6
Se stai lottando per passare dal 40% di opacità a un valore esadecimale, puoi utilizzare la ricerca di Google "Il 40% da 255 a esadecimale" fornisce il valore esadecimale per il 40%
scottyab,

54

Secondo la vista di documenti Android, alpha ha un valore compreso tra 0 e 1. Quindi, per impostarlo, utilizzare qualcosa del genere:

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

Questo è ciò che ha funzionato solo per me per l'intera vista ... Ho provato con la voce listview, che ha anche più visualizzazioni di testo. questa linea singola ha aiutato a mettere in mostra l'alfa e i suoi figli. Grazie @ cange1
Alyas il

L'unica cosa che ha funzionato anche per me. So che questo è vecchio, ma grazie @ cange1
masoftheund

50

Molto più facile da quanto sopra. L'attributo alpha predefinito è disponibile per il pulsante

android:alpha="0.5"

L'intervallo è compreso tra 0 per il trasparente completo e 1 per l'opacità completa.


Questo è esattamente quello che stavo cercando, fantastico, testato su api 21
Fernando Torres,

Risposta perfetta !!
Harry. Neem il

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

Quanto sopra è qualcosa che conosco ... Penso che la creazione di una classe di pulsanti personalizzati sia la migliore idea

Livello API 11
Recentemente mi sono imbattuto in questo attributo android: alpha xml che assume un valore compreso tra 0 e 1. Il metodo corrispondente è setAlpha (float) .


Ciao Josnidhin. Grazie per la risposta. Ma rende l'intero pulsante completamente trasparente. Quello che sto cercando è mettere un po 'di opacità (forse tramite valore alfa) sul pulsante.
ncakmak,

È un float, quindi puoi usare i valori TRA 0 e 1, 0,5 per esempio.
StackOverflow

@StackOverflowed - credo che ncakmak intendesse la prima soluzione. l'impostazione @android:color/transparentcome sfondo renderà la vista completamente trasparente. La @android:alpha- parte sembra essere un addendum.
Katzenhut,

17

Sebbene btnMybutton.getBackground().setAlpha(45);sia una buona idea, applica solo l'alfa allo sfondo e non l'intera vista.

Se si desidera applicare alfa per visualizzare btnMybutton.setAlpha(0.30f);invece utilizzare . Questo applica l'opacità a Visualizza. Accetta un valore compreso tra 0 e 1.

Doc dice:

Imposta l'opacità della vista. Questo è un valore compreso tra 0 e 1, dove 0 indica che la vista è completamente trasparente e 1 indica che la vista è completamente opaca. Se questa vista sostituisce onSetAlpha (int) per restituire true, questa vista è responsabile dell'applicazione dell'opacità stessa. Altrimenti, chiamare questo metodo equivale a chiamare setLayerType (int, android.graphics.Paint) e impostare un livello hardware. Si noti che l'impostazione di alfa su un valore traslucido (0 <alfa <1) può avere implicazioni sulle prestazioni. In genere è preferibile utilizzare la proprietà alpha con parsimonia e in modo transitorio, come nel caso delle animazioni in dissolvenza.


7

Ho riscontrato questo problema con ICS / JB perché i pulsanti predefiniti per il tema Holo sono costituiti da immagini leggermente trasparenti. Per uno sfondo questo è particolarmente evidente.

Gingerbread vs. ICS +:

Pan di zenzero ICS

Copiare tutti gli stati e le immagini disegnabili per ogni risoluzione e rendere solide le immagini trasparenti è un problema, quindi ho optato per una soluzione più sporca: avvolgere il pulsante in un supporto con uno sfondo bianco. Ecco un drawable XML grezzo (ButtonHolder) che fa esattamente questo:

Il tuo file 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>
.
.
.

Tuttavia, questo si traduce in un bordo bianco perché le immagini del pulsante Holo includono i margini per tenere conto dello spazio premuto:

Troppo bianco Troppo bianco premuto

Quindi la soluzione è dare allo sfondo bianco un margine (4dp ha funzionato per me) e angoli arrotondati (2dp) per nascondere completamente il bianco e rendere solido il pulsante:

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>

Il risultato finale è simile al seguente:

Nessun bianco Nessun bianco premuto

Dovresti scegliere come target questo stile per v14 + e modificarlo o escluderlo per Gingerbread / Honeycomb perché le dimensioni dell'immagine del pulsante nativo sono diverse da ICS e JB (ad esempio, questo stile esatto dietro un pulsante Gingerbread si traduce in un po 'di bianco sotto il pulsante).


7

Per una vista è possibile impostare l'opacità come segue.

view_name.setAlpha(float_value);

La proprietà view.setAlpha(int)è obsoleta per la versione dell'API maggiore di 11. D'ora in poi, .setAlpha(0.5f)viene utilizzata la proprietà like .


6

Per API <11 per color textView ho fatto quanto segue:

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

Un po 'ingombrante, ma ehi, funziona :-)


1

So che questo ha già un sacco di risposte, ma ho scoperto che per i pulsanti è più semplice creare i propri selettori .xml e impostarli sullo sfondo di detto pulsante. In questo modo puoi anche cambiarlo quando viene premuto o abilitato e così via. Ecco un breve frammento di uno che uso. Se si desidera aggiungere una trasparenza a uno dei colori, aggiungere un valore esadecimale iniziale (#XXcccccc). (XX == "alfa del colore")

<?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.