2010-06-01 13 views
28

A volte ho un pulsante nella mia interfaccia utente che è così piccolo che è difficile fare clic. La mia soluzione è stata finora quella di aggiungere un bordo trasparente attorno al pulsante di Photoshop. Solo aumentando il padding sul pulsante non funziona, poiché questo allungherà anche l'immagine. Dal momento che è un po 'complicato aprire Photoshop ogni volta che voglio cambiare la superficie cliccabile, c'è un modo per farlo a livello di programmazione? Ho provato a posizionare un framelayout dietro al pulsante e renderlo selezionabile, ma il pulsante non cambierà aspetto al tocco come dovrebbe. Naturalmente potrei anche aggiungere un onuchlistener sul framelayout che cambia l'aspetto dei pulsanti, ma poi è un bel po 'di codice se ho molti di quei pulsanti.Posso aumentare a livello di clic i pulsanti di un'area clic?

Cheers,

risposta

29

ho appena trovato un modo pulito per risolvere questo problema.

  1. Circonda il pulsante con un messaggio LinearLayout che ha il riempimento attorno al pulsante.
  2. Aggiungere lo stesso onclick a LinearLayout come pulsante.
  3. Nel pulsante, impostare duplicateParentState su true che evidenzia il pulsante quando si fa clic all'esterno del pulsante ma all'interno di LinearLayout.

    <LinearLayout 
        android:layout_height="fill_parent" 
        android:onClick="searchButtonClicked" 
        android:layout_centerVertical="true" 
        android:orientation="horizontal" 
        android:layout_width="wrap_content" 
        android:paddingRight="10dp" 
        android:paddingLeft="30dp"> 
        <Button 
         android:id="@+id/search_button" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:background="@drawable/toggle_button_selector" 
         android:textColor="#fff" 
         android:text="Search" 
         android:focusable="true" 
         android:textStyle="bold" 
         android:onClick="searchButtonClicked" 
         android:layout_gravity="center_vertical" 
         android:duplicateParentState="true"/> 
    </LinearLayout> 
    
+5

Funziona solo in modo ordinato. Per renderlo pienamente funzionante è necessario rendere il pulsante setClickable (false), altrimenti cliccando sul pulsante stesso non si evidenzia quando ottiene il suo stato dal genitore che non viene cliccato a questo punto. Una volta che il pulsante non è cliccabile, non è necessario impostare un listener onClick su di esso. –

2

Penso che la tua soluzione sia la migliore disponibile al momento, se non vuoi approfondire alcune cose androide e intercettare tutti gli eventi motionEvent e TouchEvents e poi dovresti anche attivare la visualizzazione di il pulsante stesso, ecc.

Basta creare uno nine patch image con un bordo trasparente elastico. In questo modo è possibile modificare la dimensione dell'immagine senza la necessità di modificare l'immagine stessa e il pulsante si ingrandirà o si restringerà senza che lo sfondo effettivo visualizzato cambi.

33

Personalmente, userei un TouchDelegate. Questo ti consente di gestire il target touch e i limiti della vista visuale come due cose diverse. Molto utile ...

http://developer.android.com/reference/android/view/TouchDelegate.html

+0

Grazie a GeorgeLawrence, hai creato un post su StackOverflow ed è quello che sto cercando! –

+0

Questa è generalmente la soluzione migliore per il problema dell'area tattile. –

+3

Una spiegazione su "TouchDelegate' e un codice snippet: http://developer.android.com/training/gestures/viewgroup.html#delegate –

1

Anothe idea è di rendere la nuova immagine trasparente e mettere l'icona su di esso in modo che la zona di contatto sarà più e design look perfetto. Check out the image

Grazie.

0

sufficiente fornire imbottitura per il layout in luogo di Margine

<ImageView 
    android:id="@+id/back_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="25dip" 
    android:src="@drawable/back_btn" /> 
+1

Questo espande lo sfondo della vista, che potrebbe non essere desiderato. – pgsandstrom

+0

sì è corretto ma può essere utile quando non c'è molto nel layout e pochi pulsanti. – sidhanshu

+0

Il riempimento non è sufficiente se non vuoi che l'immagine sia allungata, devi usare 'android: scaleType =" centerInside "' insieme al padding per ottenere l'effetto desiderato. – ForceMagic

12

Questo è un molto tardi "me too", ma dopo essere venuto a questa e ad altre domande alla ricerca di una soluzione, ho trovato un semplice, elegante soluzione del mio.

Un altro question si è lamentato che lo sfondo trasparente della loro immagine non era cliccabile. Se questo è un problema, anche questo sembra aggirarlo.

Ecco il tasto:

<ImageButton 
    android:id="@+id/arrowUp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/arrow_up" 
    android:background="@drawable/clear_button_background" /> 

Le linee interessate sono le ultime due. "@drawable/arrow_up" è alcuni stati del pulsante in file * .png definiti in un file .xml drawable * come questo:

<?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/tri_up_blue" /> <!-- pressed --> 
<item android:state_selected="true" 
     android:drawable="@drawable/tri_up_blue" /> <!-- selected --> 
<item android:state_focused="true" 
     android:drawable="@drawable/tri_up_blue" /> <!-- focused --> 
<item android:drawable="@drawable/tri_up_green" /> <!-- default --> 
</selector> 

Basta il pulsante di base. Niente di speciale. E "@drawable/clear_button_background" è proprio questo:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="@android:color/transparent"/> 
    <size android:width="20dp" android:height="30dp" /> 
</shape> 

L'altezza e la larghezza qui sono l'area cliccabile, ridimensionare, se necessario. Puoi riutilizzarlo per tutti i pulsanti di cui hai bisogno in una singola vista, a differenza dell'assurdamente dettagliato TouchDelegate. Nessun ascoltatore aggiuntivo. Non aggiunge nessuna vista o gruppo alla tua gerarchia e non dovrai fare confusione con padding e margini tutto il giorno.

Semplice. Elegante.

+3

Questo è davvero molto carino, grazie! – pgsandstrom

+0

Buona idea se si può usare ImageButton, tuttavia molti pulsanti sono basati su testo e questo rende più difficile l'applicazione. – greg7gkb

+0

@ greg7gkb per un pulsante basato sul testo, è sufficiente aggiungere il 'padding'. (Aggiungendo il padding a un pulsante basato sull'immagine si allungherebbe l'immagine, motivo per cui le persone cercano una soluzione diversa dal padding.) – ToolmakerSteve

Problemi correlati