Jak korzystać z widoku.OnTouchListener zamiast onClick

Rozwijam aplikację na Androida 2.2.2 Dla Klienta i chce wykonać następujące czynności:

Teraz mam przycisk z Zdarzenie onClick, ale on nie lubi, chce dectect, gdy użytkownik zwolni przycisk.

Znalazłem widok.OnTouchListener który myślę, że to jest to, co muszę użyć, ale czy istnieje możliwość dodania tego zdarzenia do xml, 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 jeszcze dwa pytania:

Które jest zdarzeniem skojarzonym, gdy użytkownik uwalnia palec?

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

Author: VansFannel, 2012-07-27

3 answers

Zdarzenie, gdy użytkownik zwolni palec, to MotionEvent.ACTION_UP. Nie wiem, czy są jakieś wytyczne, które zabraniają używania widoku.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;
    }
});
 57
Author: Andy Res,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 15:12:21

Przypuszczalnie, jeśli ktoś chce używać OnTouchListener zamiast OnClickListener, potrzebna jest dodatkowa funkcjonalność OnTouchListener. Jest to odpowiedź uzupełniająca, aby pokazać więcej szczegółów na temat tego, jak można użyć OnTouchListener.

Define the listener

Umieść to gdzieś w swojej aktywności lub fragmencie.

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;
    }
};

Set the listener

Ustaw słuchacza w onCreate (dla aktywności) lub onCreateView (dla Fragment).

myView.setOnTouchListener(handleTouch);

Uwagi

  • getX i getY podają współrzędne względem widoku(czyli lewego górnego rogu widoku). Będą one negatywne, gdy poruszasz się powyżej 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.
 8
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 07:59:39

OnClick jest uruchamiany, gdy użytkownik zwolni przycisk. Ale jeśli nadal chcesz używać TouchListener musisz dodać go w kodzie. Tylko:

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});
 5
Author: CaseyB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 15:07:00