Come distinguere tra spostare e fare clic in onTouchEvent()?
Nella mia applicazione, ho bisogno di gestire sia spostare e fare clic su eventi.
Un clic del mouse è una sequenza di uno ACTION_DOWN azione, diversi ACTION_MOVE azioni e una ACTION_UP azione. In teoria, se si ottiene un ACTION_DOWN evento e, quindi, un ACTION_UP evento – che significa che l’utente ha appena cliccato vostro punto di Vista.
Ma in pratica, questa sequenza non funziona su alcuni dispositivi. Sul mio Samsung Galaxy Gio ottenere tali sequenze quando, cliccando solo il mio punto di Vista: ACTION_DOWN, più volte ACTION_MOVE, quindi ACTION_UP. I. e. Ho alcuni standard forse non all’altezza OnTouchEvent fuochi con ACTION_MOVE codice di azione. Non ho mai (o quasi mai) ottenere la sequenza di ACTION_DOWN -> ACTION_UP.
Anche io non riesco a utilizzare OnClickListener perché non fornisce la posizione di un clic. Così come è possibile rilevare evento click e la differenziano da spostare?
- hai provato usando onTouch invece di onTouchEvent, così facendo si avrà un riferimento alla vista, così è possibile registrare i valori e vedere se il clic che è ACTION_DOWN e ACTION_UP vengono richiamati o non…
Ecco un’altra soluzione è molto semplice e non ha bisogno di preoccuparsi, il dito viene spostato. Se si basa un clic semplicemente la distanza di spostamento quindi come si può distinguere un clic e un clic lungo.
Si potrebbe mettere più fanno male in questo e includono la distanza percorsa, ma io sono ancora imbattuto in un caso in cui la distanza che un utente può spostare in 200 millisecondi dovrebbe costituire un movimento opposto in un click.
ViewConfiguration.getLongPressTimeout()
come durata massima di un click?System.currentTimeMillis()
invece diCalendar.getInstance().getTimeInMillis()
Ho ottenuto i migliori risultati, prendendo in considerazione:
ACTION_DOWN
eACTION_UP
eventi. Ho voluto specificare il max consentito distanza in densità indepenent pixel invece di pixel, per supportare meglio le diverse schermate. Per esempio, 15 DP.Esempio:
L’idea qui è la stessa Gemma soluzione, con queste differenze:
Aggiornamento (2015): anche verificare Gabriel versione ottimizzata di questo.
pxToDp()
funzione, dove ègetResources()
dovrebbe essere definito? Sembra che il codice è destinato a essere messo in un custom sottoclasse diView
così sembra essere cercando di accessoView#getResources()
che non può dalpxToDp()
è statico mentreView#getResources()
non è. Forse rimuovere il modificatore static o passare Contesto come parametro?onTouchEvent()
manca un valore di ritorno. Sarebbe utile se ci fai vedere cosa scrivere c’ (return true;
?return false;
?return super.onTouchEvent(e);
?)context.getResouces()
conResources.getSystem()
onTouchEvent(MotionEvent e)
cononTouchEvent(View v,MotionEvent e)
anche voi potete v. getCOntext() per pxToDPPrendendo Jonik di piombo ho costruito un po ‘ più sintonizzato versione, che non registra come fare se si sposta il dito e poi tornare a posto prima di lasciare andare:
Ecco la mia soluzione:
Utilizzare il rilevatore funziona e non aumenta in caso di trascinamento
Campo:
Inizializzare:
Classe interna:
onTouch:
Godere 🙂
Per ottenere più ottimizzato il riconoscimento di evento click Dobbiamo considerare 2 cose:
In realtà ho combinare la logica data da Stimsoni e Neethirajan
Ecco la mia soluzione:
MAX_CLICK_DISTANCE
, e il calcolo della distanza di un po ‘ diverso.setOnTouchListener()
prende anonimo classe di riferimento. Dove le variabili sono globali all’interno della classe. Penso che funzionerà a meno che a qualcuno di chiamaresetOnTouchListener()
di nuovo con altra istanza di ascoltatore.Di seguito il codice per risolvere il problema
È molto difficile per un ACTION_DOWN a verificarsi senza un ACTION_MOVE che si verificano. La minima contrazione del dito sullo schermo in un punto diverso rispetto a quello in cui il primo contatto si è verificato attiverà l’evento di SPOSTAMENTO. Inoltre, credo che un cambiamento nella pressione di un dito, anche innescare il movimento di evento. Vorrei utilizzare un’istruzione if in Action_Move metodo di prova per determinare la distanza lo spostamento si è verificato dall’originale movimento verso il BASSO. se la mossa si è verificato al di fuori di qualche raggio, la vostra azione di movimento si sarebbe verificato. Probabilmente non è il migliore, efficiente in termini di risorse modo per fare ciò che il vostro cercando ma dovrebbe funzionare.
Se si vuole reagire a scegliere, utilizzare:
Aggiunta alle risposte di cui sopra ,se si desidera implementare sia onClick e Trascinare le azioni quindi il mio codice qui di seguito potete ragazzi. L’assunzione di alcuni dei aiutare da @Stimsoni :
Utilizzando Gil SH risposta, ho migliorato mediante l’attuazione di
onSingleTapUp()
piuttosto cheonSingleTapConfirmed()
. È molto più veloce e non fare clic su visualizzazione, se trascinato/spostato.GestureTap:
Come: