2010-04-26 20 views
17

¿Cómo puedo hacer que un botón de imagen permanezca en el estado 'presionado' cuando se hace clic en él? Básicamente, solo quiero que el fondo sea el fondo deprimido, pero no puedo encontrar la manera de configurarlo. Por el momento, acabo de copiar el fondo del botón seleccionado en mi carpeta res, pero cuando lo configuro como fondo, se vuelve borroso (ya que la imagen original es más grande que el botón).Android Establecer ImageButton como Alternar

Antecedentes normal: alt text http://img707.imageshack.us/img707/9199/ss20100426163452.png Lo que quiero decir: alt text http://img707.imageshack.us/img707/912/ss20100426163357.png alt text http://img3.imageshack.us/img3/8304/ss20100426163623.png

también que no creen realmente que puedo utilizar este método teniendo en cuenta las diferentes disposiciones de la interfaz de usuario. El botón debe mantenerse presionado según la interfaz de usuario que el usuario esté usando.

+0

¿Estás seguro de que no quieres un 'ToggleButton' en lugar de un' ImageButton'? – CommonsWare

+0

El botón de alternar todavía no me deja configurar el botón para que parezca presionado. Tendría que hacer manualmente iconos personalizados para cada botón. Solo quiero que la imagen de fondo sea la que está presionada. – GuyNoir

Respuesta

40

Hay algunas maneras de hacer esto:

primer lugar, puede simplemente utilizar un ImageButton y manualmente cambiar su imagen en dibujable clic en Java. Esto es lo que el stock Music player en Android does for the 'shuffle' button, por ejemplo. Aunque no tendrá control sobre el fondo del botón en estado comprobado, podrá cambiar la imagen, lo que puede ser favorable desde una perspectiva de coherencia de la interfaz de usuario de Android.

Otra opción es utilizar un conjunto complejo de elementos descartables y nueve parches para obtener una imagen dentro de un ToggleButton, con la opción de cambiar el fondo y/o el recurso de imagen al alternar. Esa es la opción que mostraré a continuación. Pero recuerde, tenga cuidado con la consistencia de UI antes de hacer esto.


res/layout/foo.xml

... 
<ToggleButton 
    android:textOn="" android:textOff="" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/shuffle_button" /> 
... 

res/estirable/shuffle_button.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- use "@android:drawable/btn_default" to keep consistent with system --> 
    <item android:drawable="@drawable/toggle_button_background" /> 
    <item android:drawable="@drawable/shuffle_button_image" /> 
</layer-list> 

res/estirable/toggle_button_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- checked state --> 
    <item android:state_pressed="false" android:state_checked="true" 
      android:drawable="@drawable/btn_default_checked" /> 

    <item android:state_window_focused="false" android:state_enabled="true" 
      android:drawable="@drawable/btn_default_normal" /> 
    <item android:state_window_focused="false" android:state_enabled="false" 
      android:drawable="@drawable/btn_default_normal_disable" /> 
    <item android:state_pressed="true" 
      android:drawable="@drawable/btn_default_pressed" /> 
    <item android:state_focused="true" android:state_enabled="true" 
      android:drawable="@drawable/btn_default_selected" /> 
    <item android:state_enabled="true" 
      android:drawable="@drawable/btn_default_normal" /> 
    <item android:state_focused="true" 
      android:drawable="@drawable/btn_default_normal_disable_focused" /> 
    <item android:drawable="@drawable/btn_default_normal_disable" /> 
</selector> 

res/dibujable/shuffle_button_image.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/ic_mp_shuffle_on_btn" android:state_checked="true" /> 
    <item android:drawable="@drawable/ic_mp_shuffle_off_btn" /> 
</selector> 

archivos de imagen

  • btn_default_<state>.9.png se pueden encontrar en frameworks/base.git bajo core/res/res/drawable-hdpi y core/res/res/drawable-mdpi (también LDPI). ADVERTENCIA: si utiliza esto, su aplicación se verá incoherente en dispositivos con interfaces de usuario del sistema operativo personalizadas (es decir, la interfaz de usuario de Sense de HTC).
  • ic_mp_shuffle_<state>_btn.9.png deben tener nueve parches, de modo que la imagen se centre y no se estire para ajustarse al botón. A continuación se presentan ejemplo hdpi versiones del icono:

res/drawable- (h | m | LDPI)/(ic_mp_shuffle_ on | off) _btn.9.png

ic_mp_shuffle_on_btn.9.png http://nikonizer.yfrog.com/Himg404/scaled.php?tn=0&server=404&filename=icmpshuffleonbtn9.png&xsize=640&ysize=640ic_mp_shuffle_off_btn.9.png http://nikonizer.yfrog.com/Himg708/scaled.php?tn=0&server=708&filename=icmpshuffleoffbtn9.png&xsize=640&ysize=640


Nota final: Recuerde que debe ser compatible con la interfaz de usuario del sistema cuando sea posible, y ser conscientes del hecho de que su aplicación puede funcionar en dispositivos con versiones personalizadas del sistema operativo que tienen diferentes gráficos para elementos de IU como botones. Un ejemplo de esto es HTC Sense, que tiene botones verdes en lugar de los grises/naranjas/amarillos en stock de Android. Por lo tanto, si termina copiando los archivos btn_default_... PNG del repositorio de código abierto para crear un fondo de botón alternar, romperá la coherencia en esos dispositivos.

+0

Supongo que no hay forma de acceder a los recursos directamente desde el sistema operativo para que pueda captar el fondo correcto todo el tiempo. – GuyNoir

+0

No, porque '@android: drawable/btn_default_normal' y similares (los nueve parches) no son públicos, pero' @android: drawable/btn_default' (el selector) es público. Lamentablemente, el selector no incluye un estado verificado. –

+0

Bah. Muy bien, gracias por la información. – GuyNoir

Cuestiones relacionadas