2012-10-10 45 views
35

He configurado un ImageButton para que sea transparente, por lo que el icono coincide con el panel de fondo como la barra de acciones de Android. Esto se ve bien como yo quiero.ImageButton no resalta al hacer clic con Fondo transparente

Sin embargo, cuando el fondo es transparente, no aparece el punto culminante azulado que aparece cuando presiona un botón transparente en la barra de acciones.

¿Puedo tener un ImageButton que sea transparente y que además tenga el flash de resaltado al hacer clic?

<ImageButton 
    android:id="@+id/nextItemButton" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:background="@null" 
    android:src="@drawable/ic_media_ff" /> 

Respuesta

32

Todo lo que necesita hacer es establecer el fondo adecuado. Si quieres que sea transparente en estado normal y azulado en preestablecido.

Crea un StateListDrawable como este en el directorio res/drawable.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/my_bluish_color" android:state_pressed="true"/> 
    <item android:drawable="@android:color/transparent"/> 
</selector> 

De esta manera, el fondo predeterminado es transparente. Cuando se presiona, el fondo tiene el color que especificó (en lugar de color, puede usar cualquier dibujar aquí).

+0

Desafortunadamente, el botón resaltar en los estilos incorporados de Android no es público. Este es el color personalizado con el que terminé. Estaba lo más cerca que pude del color Jelly Bean, que creo que es del mismo color en ICS: # 057891 Usar el StateListDrawable funcionó muy bien. –

+0

El color predeterminado presionado depende del dispositivo y de la versión de Android que se esté ejecutando. El tema Holo usa un parche azulado semitransparente de 9 parches en estado comprimido. – Tomik

+0

Finalmente algo que funciona. Gracias – frostymarvelous

2

Si desea hacerlo mediante programación, aquí es una solución:

Crear una clase personalizada ImageButton y anular drawableStateChange():

public class CustomImageButton extends ImageButton { 

    @Override 
    protected void drawableStateChanged() { 
     Log.d("Button", "isPressed: " + isPressed()); 
     if(isPressed()){ 
      setBackgroundResource(android.R.color.holo_blue_dark); 
     } else { 
      setBackgroundResource(android.R.color.transparent); 
     } 
     super.drawableStateChanged(); 

    } 

    public CustomImageButton(Context context) { 
     super(context); 
    } 

    public CustomImageButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomImageButton(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // TODO Auto-generated constructor stub 
    } 



} 
114

me encontré con este mismo problema. Por último, tengo una muestra de un código con ese atributo:

android:background="?android:selectableItemBackground" 

Este attibute dará un fondo transparente con resaltado seleccionable a cualquier vista (Button, ImageButton, Vista de Texto ...) SIN MÁS DE CODIFICACIÓN !!!

+3

Si está utilizando ActionBarSherlock, use android: background = "? SeleccionatableItemBackground" en su lugar. – NightWhistler

+1

¿Se puede establecer esto en una vista mediante programación? – Badams

+1

vota esto chicos! la mejor solución que pude encontrar! –

4

sólo para añadir en Fernández buena respuesta:

Si desea que el efecto sea redonda y no uso rectángulo:

android:background="?android:selectableItemBackgroundBorderless"  

(* para los V21 y superiores).