Cómo configurar la opacidad (alfa) para ver en Android

211

Tengo un botón como el siguiente:

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

En mi onCreate()caso, llamo a Button01 así:

setContentView(R.layout.main);

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

Hay un fondo en la aplicación, y quiero establecer una opacidad en este botón de envío. ¿Cómo puedo establecer una opacidad para esta vista? ¿Es algo que puedo configurar en el lado de Java, o puedo configurar en el archivo main.xml?

En el lado de Java intenté Button01.mutate().SetAlpha(100), pero me dio un error.

ncakmak
fuente

Respuestas:

64

Acabo de encontrar su pregunta mientras tenía el problema similar con un TextView. Pude resolverlo extendiendo TextView y anulando onSetAlpha. Tal vez podrías probar algo similar con tu botón:

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;
  }
}
RoToRa
fuente
12
Gracias, esto también me ayudó. Sin embargo, es ridículo que un TextView y un ImageView tengan diferentes formas de configurar alfa.
Geraldo Nascimento
Esto también me ayudó a aplicar el efecto de clic en la vista de imagen sin un segundo recurso. Gracias !!
skygeek
568

Estoy sorprendido por las respuestas MUCHO más complicadas de todos los demás .

XML

Puede definir simplemente el alfa en la definición de color del botón (o cualquier otra vista) en su xml:

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

En el ejemplo anterior, el color sería un rojo parcialmente transparente.

Al definir el color de una vista, el formato puede ser #RRGGBBo #AARRGGBB, donde AAestá el valor alfa hexadecimal. FFsería completamente opaco y 00sería totalmente transparente.

Dinamicamente

Si necesita alterar dinámicamente la opacidad en su código, use

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

Donde el INT varía de 0(completamente transparente) a 255(completamente opaco).

Jake Wilson
fuente
18
Esta aún no es la solución si tienes un compuesto extraíble
Michał K
66
Establezca el color verde transparente de la vista: <RelativeLayout android: background = "# 8700FF00" />
Jonny
2
La vista no tiene android:coloratributo.
Ronnie
66
@moshersan Puede configurar el color en el Android: ¡propiedad de fondo en sí!
Dheeraj Bhaskar
1
Eso es backgroundopacidad incorrecta, no es viewopacidad. No es equivalente en muchos casos de uso
Jocky Doe
215

Supongo que ya has encontrado la respuesta, pero si no (y para otros desarrolladores), puedes hacerlo así:

btnMybutton.getBackground().setAlpha(45);

Aquí configuré la opacidad en 45. Básicamente, puede configurarla entre 0 (completamente transparente) y 255 (completamente opaca)

abhi
fuente
55
Esto solo está disponible en API 11+ developer.android.com/reference/android/view/…
Graeme
8
@Graeme se ha vinculado al método setAlpha en la clase View, pero la publicación está usando setAlpha en la clase Drawable. El método getBackground devuelve un Drawable. Este método es del API Nivel 1. developer.android.com/reference/android/graphics/drawable/…
Geekygecko
¡Oh, interesante! Yo no vi eso. ¿Significaría esto que el texto es totalmente visible incluso si el fondo se configuró en transparente?
Graeme
-1 esto no funciona en mi caso donde mi fondo dibujable es un selector.
Mike S
3
esto funciona muy bien pero con un efecto secundario: ¡tengo muchos botones que comparten el mismo fondo y se vuelven todos transparentes! :(
Marcar el
66

Lo que sugeriría que haga es crear un color ARGB personalizado en su archivo colors.xml como:

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

luego configure el fondo del botón con ese color:

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

Otra cosa que puede hacer si quiere jugar con la forma del botón es crear un recurso dibujable de Forma donde configure las propiedades del aspecto del botón:

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

Luego use eso como el fondo del botón:

    android:background="@drawable/rounded_corner_box"
Akos Cz
fuente
66
Si está luchando para pasar del 40% de opacidad a un valor hexadecimal, puede usar la búsqueda de Google "40% de 255 a hexadecimal" da el valor hexadecimal para 40%
scottyab
54

De acuerdo con los documentos de Android, la vista alfa es un valor entre 0 y 1. Entonces, para configurarlo, use algo como esto:

View v;
v.setAlpha(.5f);
cange1
fuente
Eso es lo que solo funcionó para mí para la vista completa ... He probado el elemento de vista de lista, que también tiene varias vistas de texto. Esta línea única ayudó a establecer alfa en vista y sus hijos. Gracias @ cange1
Alyas
Lo único que funcionó para mí también. Sé que esto es viejo, pero gracias @ cange1
masoftheund
50

Mucho más fácil de lo anterior. El atributo alfa predeterminado está ahí para el botón

android:alpha="0.5"

El rango está entre 0 para una transparencia completa y 1 para una opacidad completa.

Raja Jawahar
fuente
Esto es exactamente lo que estaba buscando, increíble, probado en la API 21
Fernando Torres
¡¡Respuesta perfecta!!
Harry. Naeem el
18
android:background="@android:color/transparent"

Lo anterior es algo que sé ... Creo que crear una clase de botón personalizado es la mejor idea

Nivel de API 11
Recientemente me encontré con este atributo android: alpha xml que toma un valor entre 0 y 1. El método correspondiente es setAlpha (float) .

Josnidhin
fuente
Hola Josnidhin Gracias por su respuesta. Pero hace que todo el botón sea completamente transparente. Lo que estoy buscando es poner algo de opacidad (tal vez a través del valor alfa) en el botón.
ncakmak
Es un flotante, por lo que puede usar valores ENTRE 0 y 1, 0.5 por ejemplo.
StackOverflowed
@StackOverflowed: creo que ncakmak significó la primera solución. establecer @android:color/transparentcomo fondo hará que la vista sea completamente transparente. La @android:alphaparte parece ser un apéndice.
Katzenhut
17

Aunque btnMybutton.getBackground().setAlpha(45);es una buena idea, solo aplica alfa al fondo y no a toda la vista.

Si desea aplicar alfa para ver el uso btnMybutton.setAlpha(0.30f); en lugar. Esto aplica opacidad a la vista. Acepta un valor entre 0 y 1.

Doc dice:

Establece la opacidad de la vista. Este es un valor de 0 a 1, donde 0 significa que la vista es completamente transparente y 1 significa que la vista es completamente opaca. Si esta vista anula onSetAlpha (int) para devolver verdadero, entonces esta vista es responsable de aplicar la opacidad misma. De lo contrario, llamar a este método es equivalente a llamar a setLayerType (int, android.graphics.Paint) y configurar una capa de hardware. Tenga en cuenta que establecer alfa en un valor translúcido (0 <alfa <1) puede tener implicaciones de rendimiento. En general, es mejor usar la propiedad alfa con moderación y transitoriamente, como en el caso de las animaciones que se desvanecen.

Hesam
fuente
7

Me he encontrado con este problema con ICS / JB porque los botones predeterminados para el tema Holo consisten en imágenes que son ligeramente transparentes. Para un fondo esto es especialmente notable.

Pan de jengibre vs. ICS +:

Pan de jengibre ICS

Copiar sobre todos los estados e imágenes dibujables para cada resolución y hacer que las imágenes transparentes sean sólidas es un dolor, así que he optado por una solución más sucia: envuelva el botón en un soporte que tenga un fondo blanco. Aquí hay un crudo XML dibujable (ButtonHolder) que hace exactamente eso:

Su archivo 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>
.
.
.

Sin embargo, esto da como resultado un borde blanco porque las imágenes del botón Holo incluyen márgenes para tener en cuenta el espacio presionado:

Demasiado blanco Demasiado blanco prensado

Entonces, la solución es darle un margen al fondo blanco (4dp funcionó para mí) y esquinas redondeadas (2dp) para ocultar completamente el blanco y hacer que el botón sea sólido:

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>

El resultado final se ve así:

No blanco No blanco presionado

Debe orientar este estilo para v14 + y ajustarlo o excluirlo para Gingerbread / Honeycomb porque sus tamaños de imagen de botón nativos son diferentes de los de ICS y JB (por ejemplo, este estilo exacto detrás de un botón de Gingerbread da como resultado un poco de blanco debajo del botón).

annie
fuente
7

Para una vista, puede establecer la opacidad de la siguiente manera.

view_name.setAlpha(float_value);

La propiedad view.setAlpha(int)está en desuso para la versión API mayor que 11. De ahora en adelante, .setAlpha(0.5f)se usa la propiedad like .

Palash Dange
fuente
6

Para API <11 para textView color hice lo siguiente:

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

Un poco engorroso, pero bueno, funciona :-)

EZDsIt
fuente
1

Sé que esto ya tiene muchas respuestas, pero descubrí que para los botones es más fácil crear sus propios selectores .xml y establecerlos en el fondo de dicho botón. De esa manera también puede cambiar su estado cuando se presiona o se habilita, etc. Aquí hay un fragmento rápido de uno que uso. Si desea agregar una transparencia a cualquiera de los colores, agregue un valor hexadecimal inicial (#XXcccccc). (XX == "alfa de 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>
Konrad Winkowski
fuente