2011-06-16 16 views
5

En iOS, si configuro el fondo de un botón para una imagen, cuando presiono el botón, se sombreará todo el contenido del botón (incluido el texto). ¿Puedo lograr el mismo efecto en Android, o tengo que usar diferentes imágenes para diferentes estados? Además, incluso si uso diferentes imágenes para diferentes estados, ¿cómo hago que el texto también se sombree? Una forma sucia es establecer un OnClickListener en el botón y sombrear el texto de forma programada cuando se presiona, pero ¿hay otras formas?¿Alterar automáticamente el fondo del botón y la apariencia del texto cuando se presiona (como iOS)?

+0

Es un botón de activación, donde el estado puede ser hacia arriba o hacia abajo, o un botón normal en el que sólo se ve diferente, ya que es haciendo clic en? – TomHarrigan

+0

Es un botón normal. – hzxu

Respuesta

7

He estado tratando de encontrar una solución para esto desde hace un tiempo, pero no pude encontrar nada, así que se me ocurrió una solución bastante limpia que funciona en todos los botones de imagen. Al igual que iOS.

  • Cree una imagen negra, 10% transparente y guárdela como PNG. Lo llamo button_pressed.png. Usted puede utilizar esta imagen, http://img84.imageshack.us/img84/7924/buttonpressed.png

  • Crear una dibujable llamado algo relevante, lo llamo "button_pressed_layout.xml"

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android=" http://schemas.android.com/apk/res/android"> 
        <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> 
    </selector> 
    
  • Ahora ponga su imagen del botón en el LinearLayout y luego el botón dentro de la LinearLayout . En el botón, use button_pressed_layout.xml como fondo.

    <LinearLayout 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:background="@drawable/button_image"> 
         <Button 
          android:id="@+id/myButtonId" 
          android:text="@string/Continue" 
          android:layout_width="fill_parent" 
          android:layout_height="fill_parent" 
          android:background="@drawable/button_pressed_layout" 
          android:textColor="#FFF" 
          android:textSize="16dp" >     
         </Button> 
        </LinearLayout> 
    

eso es todo!

0

Con el fin de darle al botón de sí diferentes efectos, creo que es necesario utilizar imágenes personalizadas, como se ve here y, en menor detalle here En cuanto al texto, this post parece que sería hacer el truco para la sombra

2

Para obtener un estado presionado sin crear una imagen de 2º botón, creé un OnTouchListener para cambiar el alfa del botón. Este no es el estado presionado más hermoso, pero ofrece un comportamiento automático efectivo.

public class PressedStateOnTouchListener implements OnTouchListener 
{ 
    PressedStateOnTouchListener(float alphaNormal) 
    { 
     mAlphaNormal = alphaNormal; 
    } 

    public boolean onTouch(View theView, MotionEvent motionEvent) 
    { 
     switch(motionEvent.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       theView.setAlpha(mAlphaNormal/2.0f); 
       break; 

      case MotionEvent.ACTION_UP: 
       theView.setAlpha(mAlphaNormal); 
       break; 
     } 

     // return false because I still want this to bubble off into an onClick 
     return false; 
    } 

    private float mAlphaNormal; 
} 

En su actividad, aplicar este oyente a cada botón:

Button theButton = (Button)findViewById(R.id.my_button_id); 
theButton.setOnTouchListener(new PressedStateOnTouchListener(theButton.getAlpha())); 
+0

Esto da el "opuesto" de un estado presionado. Debes oscurecer la imagen para mostrarla presionada, no aclararla. y sobre un fondo blanco esto lo aclara. – dacopenhagen

Cuestiones relacionadas