2010-04-26 19 views
17

Come è possibile che un pulsante dell'immagine rimanga nello stato "premuto" quando viene fatto clic? Fondamentalmente voglio solo che lo sfondo sia lo sfondo depresso, ma non riesco a capire come impostarlo. Al momento, ho appena copiato lo sfondo del pulsante selezionato nella mia cartella di ricerca, ma quando lo imposto come sfondo, diventa sfocato (poiché l'immagine originale è più grande del pulsante stesso).Set Android ImageButton as Toggle

Sfondo normale: alt text http://img707.imageshack.us/img707/9199/ss20100426163452.png Quello che sto ricevendo: alt text http://img707.imageshack.us/img707/912/ss20100426163357.png alt text http://img3.imageshack.us/img3/8304/ss20100426163623.png

Anche io non credo posso effettivamente usare questo metodo considerando i numerosi layout dell'interfaccia utente differenti. Il pulsante dovrebbe rimanere premuto secondo l'interfaccia utente che l'utente sta utilizzando.

+0

Sei sicuro di non volere un 'ToggleButton' invece di un' ImageButton'? – CommonsWare

+0

Il pulsante di attivazione continua a non consentirmi di impostare il pulsante in modo che appaia premuto. Dovrei creare manualmente icone personalizzate per ogni pulsante. Voglio solo che l'immagine di sfondo sia quella pressata. – GuyNoir

risposta

40

Ci sono alcuni modi per farlo:

In primo luogo, si può semplicemente utilizzare un ImageButton e manualmente alternare la sua drawable immagine sullo scatto in Java. Questo è ciò che il stock Music player su Android does for the 'shuffle' button, per esempio. Anche se non avrai il controllo sullo sfondo del pulsante nel suo stato controllato, sarai in grado di scambiare l'immagine, che potrebbe essere favorevole da una prospettiva di coerenza dell'interfaccia utente Android.

Un'altra opzione consiste nell'utilizzare un set complesso di drawable e nove patch per ottenere un'immagine all'interno di uno ToggleButton, con l'opzione di modificare lo sfondo e/o la risorsa immagine al passaggio. Questa è l'opzione che mostrerò qui sotto. Ma ricorda, fai attenzione alla coerenza dell'interfaccia utente prima di farlo.


res/layout/foo.xml

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

ris/drawable/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> 

ris/drawable/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/drawable/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> 

file immagine

  • btn_default_<state>.9.png possono essere trovati in frameworks/base.git sotto core/res/res/drawable-hdpi e core/res/res/drawable-mdpi (anche ldpi). AVVISO: se si utilizzano questi dati, l'app apparirà incoerente sui dispositivi con interfaccia utente del sistema operativo personalizzata (ad esempio l'interfaccia utente di Sense di HTC).
  • ic_mp_shuffle_<state>_btn.9.png devono essere nove patch, in modo che l'immagine sia centrata e non allungata per adattarsi al pulsante. Qui di seguito sono esempio hdpi versioni dell'icona:

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 finale: Ricorda di essere coerente con l'interfaccia utente del sistema, quando possibile, ed essere consapevole del fatto che la vostra applicazione può funzionare su dispositivi con versioni personalizzate del sistema operativo che hanno una grafica diversa per elementi dell'interfaccia utente come i pulsanti. Un esempio di questo è HTC Sense, che ha pulsanti verdi al posto di quelli grigi/arancioni/gialli in stock Android. Pertanto, se si finisce di copiare i file PNG btn_default_... dal repository open source per creare uno sfondo pulsante commutabile, si interromperà la coerenza su tali dispositivi.

+0

Suppongo che non ci sia modo di accedere alle risorse direttamente dal sistema operativo stesso in modo tale da ottenere sempre lo sfondo corretto? – GuyNoir

+0

No, poiché '@android: drawable/btn_default_normal' e simili (le nove patch) non sono pubblici, ma' @android: drawable/btn_default' (il selettore) è pubblico. Sfortunatamente il selettore non include uno stato controllato. –

+0

Bah. Va bene, grazie per le informazioni. – GuyNoir