2010-06-01 16 views
28

Czasami mam przycisk w interfejsie użytkownika, który jest tak mały, że trudno go kliknąć. Moim dotychczasowym rozwiązaniem było dodanie przezroczystego obramowania wokół przycisku w programie Photoshop. Tylko zwiększenie wypełnienia przycisku nie działa, ponieważ spowoduje to również rozciągnięcie obrazu. Skoro za każdym razem, gdy chcę zmienić klikalną powierzchnię, jest trochę zamieszania, aby otworzyć program photoshop, czy jest jakiś sposób, aby to zrobić programowo? Próbowałem umieścić framelayout za przyciskiem i sprawić, by było klikalne, ale wtedy przycisk nie zmienia wyglądu w dotyku, tak jak powinien. Oczywiście mógłbym również dodać do listy obserwatorów na framelayout, który zmienia wygląd przycisków, ale to całkiem sporo kodu, jeśli mam kilka z tych przycisków.Czy można programowo zwiększyć przyciski onclick-area?

Cheers,

Odpowiedz

29

Właśnie znalazł schludny sposób, aby rozwiązać ten problem.

  1. Otaczanie przycisku za pomocą liniowego polecenia LinearLayout z dopełnieniem przycisku.
  2. Dodaj ten sam adres do LinearLayout jako przycisku.
  3. w przycisku ustawić duplicateParentState true które sprawiają, przycisk podświetlenia po kliknięciu przycisku zewnątrz ale wewnątrz 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

To działa tylko sortof. Aby było w pełni funkcjonalne, musisz ustawić przycisk setClickable (false). W przeciwnym razie kliknięcie samego bota nie będzie podświetlane, ponieważ otrzyma swój stan od rodzica, który nie zostanie kliknięty w tym miejscu. Po kliknięciu przycisku nie można kliknąć, nie trzeba ustawiać na nim obiektu nasłuchującego onClick. –

2

Myślę, że twoje rozwiązanie jest najlepsze dostępne obecnie, jeśli nie chcesz zagłębić się w niektóre rzeczy z Androidem i przechwycić wszystkie zdarzenia motionEvent i TouchEvents, a także musisz wyzwolić wciśnięty widok przycisk samemu itp

Wystarczy utworzyć nine patch image z rozciągliwego przezroczystego granicy. W ten sposób można zmienić rozmiar obrazu bez konieczności zmiany samego obrazu, a przycisk będzie się powiększał lub zmniejszał bez zmiany faktycznego wyświetlanego tła.

33

Osobiście użyłbym TouchDelegate. Pozwala to uporać się z celem dotykowym, a wizualizacja ogranicza się do dwóch różnych rzeczy. Bardzo przydatny ...

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

+0

Dzięki GeorgeLawrence, napisałeś jeden post na stackoverflow i jest to ten, którego szukam! –

+0

Jest to zazwyczaj najlepsze rozwiązanie problemu z ekranem dotykowym. –

+3

Wyjaśnienie dotyczące "TouchDelegate" i kodu fragmentu kodu: http://developer.android.com/training/gestures/viewgroup.html#delegate –

1

anothe pomysłem jest, aby nowy przezroczysty obraz i umieścić ikonę na nim więc obszar dotykowy będzie coraz projekt doskonały wygląd. Check out the image

Dziękuję.

0

Wystarczy zapewnić dopełnienie do układu zamiast Margin

<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

Spowoduje to rozszerzenie tła widoku, co może nie być pożądane. – pgsandstrom

+0

tak, to prawda, ale może być pomocne, gdy nie ma nic w układzie i kilka przycisków. – sidhanshu

+0

Wypełnienie nie wystarczy, jeśli nie chcesz, aby obraz był rozciągnięty, musisz użyć 'android: scaleType =" centerInside "' wraz z dopełnieniem, aby uzyskać pożądany efekt. – ForceMagic

12

To bardzo późno „ja też”, ale po dojściu do tego i inne pytania szuka rozwiązania, znalazłem prosty, elegancki rozwiązanie własne.

Kolejny question skarżył się, że przezroczyste tło ich obrazu nie było klikalne. Jeśli to jest problem, wydaje się, że również to obejdzie.

Oto przycisk:

<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" /> 

Odpowiednie linie są ostatnie dwa. "@drawable/arrow_up" jest kilka stanów przycisków w plikach * .png określonych w rozciągliwej * .xml plik tak:

<?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> 

Po prostu podstawowy przycisk. Nic specjalnego. I "@drawable/clear_button_background" jest właśnie to:

<?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> 

wysokość i szerokość są tu obszar klikalny, zmiana rozmiaru w razie potrzeby. Możesz użyć go ponownie na tyle przycisków, ile potrzebujesz w jednym widoku, w przeciwieństwie do absurdalnie szczegółowych TouchDelegate. Brak dodatkowych słuchaczy. Nie dodaje żadnych widoków ani grup do twojej hierarchii i nie będziesz się bawić z dopełnieniem i marginesami przez cały dzień.

Proste. Elegancki.

+3

To jest naprawdę naprawdę miłe, dzięki! – pgsandstrom

+0

Dobry pomysł, jeśli możesz użyć ImageButton, jednak wiele przycisków jest opartych na tekście, co sprawia, że ​​jest to trudniejsze do zastosowania. – greg7gkb

+0

@ greg7gkb dla przycisku tekstowego, po prostu dodajesz "dopełnienie". (Dodanie dopełnienia do przycisku opartego na obrazie spowodowałoby rozciągnięcie obrazu, dlatego ludzie szukają rozwiązania innego niż dopełnienie). – ToolmakerSteve

Powiązane problemy