2012-07-27 12 views
32

Zajmuję Android 2.2.2 dla klienta i chce wykonać następujące czynności:Jak korzystać View.OnTouchListener zamiast onClick

Teraz mam przycisku ze zdarzeniem onClick ale on nie robi” Tak jak on, chce wykryć, kiedy użytkownik zwolni przycisk.

Znalazłem View.OnTouchListener, który myślę, że to jest to, czego potrzebuję użyć, ale czy istnieje możliwość dodania tego zdarzenia do xml tak jak zrobiłem z onClick?

<ImageButton 
    android:id="@+id/btnSaveNewGate" 
    android:layout_width="@dimen/btnSaveNewGate_width" 
    android:layout_height="@dimen/btnSaveNewGate_height" 
    android:layout_below="@+id/radioGrGateType" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="@dimen/btnSaveNewGate_marginTop" 
    android:background="@null" 
    android:contentDescription="@string/layout_empty" 
    android:onClick="onSaveNewGateClick" 
    android:scaleType="fitXY" 
    android:src="@drawable/save_gate_selector" /> 

Mam dwa pytania więcej:

który jest wydarzeniem wiąże się gdy użytkownik zwolni palcem?

Czy istnieją wytyczne, które zabraniają używania View.OnTouchListener zamiast onClick?

Odpowiedz

54

Zdarzenie, gdy użytkownik puści swój palec, to MotionEvent.ACTION_UP. Nie wiem, czy istnieją jakieś wytyczne, które zabraniają używania View.OnTouchListener zamiast onClick(), najprawdopodobniej zależy to od sytuacji.

Oto przykładowy kod:

imageButton.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP){ 

      // Do what you want 
      return true; 
     } 
     return false; 
    } 
}); 
+4

Alternatywnie można użyć przełącznika event.getAction(), a przypadki to MotionEvent.ACTION_UP, MotionEvent.ACTION_DOWN i tak dalej. –

+1

na jednym plus jeden pokazuje MotionEvent.ACTION_DOWN zamiast kliknij – lionheart

+0

Zwróć uwagę, że jeśli zwrócisz tam wartość false, klauzula if nigdy nie uruchomi się. Zobacz: https://stackoverflow.com/a/20359888/564628 –

5

OnClick uruchamia się, gdy użytkownik zwolni przycisk. Ale jeśli nadal chcesz używać TouchListener, musisz dodać go w kodzie. Po prostu:

myView.setOnTouchListener(new View.OnTouchListener() 
{ 
    // Implementation; 
}); 
6

Można przypuszczać, że jeśli chce się użyć OnTouchListener raczej niż OnClickListener, wtedy potrzebna jest dodatkowa funkcjonalność OnTouchListener. To jest odpowiedź uzupełniająca, aby pokazać więcej szczegółów na temat tego, jak można użyć OnTouchListener.

Definiowanie słuchacza

Umieść ten gdzieś w działalności lub fragmentu.

private View.OnTouchListener handleTouch = new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Log.i("TAG", "touched down"); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       Log.i("TAG", "moving: (" + x + ", " + y + ")"); 
       break; 
      case MotionEvent.ACTION_UP: 
       Log.i("TAG", "touched up"); 
       break; 
     } 

     return true; 
    } 
}; 

Ustawienie detektora

ustawiona słuchacza onCreate (dla aktywności) lub onCreateView (dla fragmentu).

myView.setOnTouchListener(handleTouch); 

Uwagi

  • getX i getY daje współrzędne względem widoku (czyli lewy górny róg widoku). Będą ujemne podczas przesuwania się nad lub po lewej stronie widoku. Użyj getRawX i getRawY, jeśli chcesz mieć bezwzględne współrzędne ekranu.
  • Możesz użyć wartości x i y, aby określić takie rzeczy jak kierunek przesunięcia.