Volevo un semplice e interfaccia riutilizzabile che ascolta i due tap e il beh di due dita aves come GestureDetector. In modo che si potrebbe usare in questo modo (tutto tagliato & incollare il codice eseguibile):
public class Example extends Activity {
SimpleTwoFingerDoubleTapDetector multiTouchListener = new SimpleTwoFingerDoubleTapDetector() {
@Override
public void onTwoFingerDoubleTap() {
// Do what you want here, I used a Toast for demonstration
Toast.makeText(Example.this, "Two Finger Double Tap", Toast.LENGTH_SHORT).show();
}
};
// Override onCreate() and anything else you want
@Override
public boolean onTouchEvent(MotionEvent event) {
if(multiTouchListener.onTouchEvent(event))
return true;
return super.onTouchEvent(event);
}
}
ho creato SimpleTwoFingerDoubleTapDetector. (E 'un nome lungo, ma è descrittiva È possibile rinominare come tutto quello che vuoi..) Salvare questo nuovo file all'interno del vostro progetto o come libreria:
public abstract class SimpleTwoFingerDoubleTapDetector {
private static final int TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 100;
private long mFirstDownTime = 0;
private boolean mSeparateTouches = false;
private byte mTwoFingerTapCount = 0;
private void reset(long time) {
mFirstDownTime = time;
mSeparateTouches = false;
mTwoFingerTapCount = 0;
}
public boolean onTouchEvent(MotionEvent event) {
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
if(mFirstDownTime == 0 || event.getEventTime() - mFirstDownTime > TIMEOUT)
reset(event.getDownTime());
break;
case MotionEvent.ACTION_POINTER_UP:
if(event.getPointerCount() == 2)
mTwoFingerTapCount++;
else
mFirstDownTime = 0;
break;
case MotionEvent.ACTION_UP:
if(!mSeparateTouches)
mSeparateTouches = true;
else if(mTwoFingerTapCount == 2 && event.getEventTime() - mFirstDownTime < TIMEOUT) {
onTwoFingerDoubleTap();
mFirstDownTime = 0;
return true;
}
}
return false;
}
public abstract void onTwoFingerDoubleTap();
}
In primo luogo, alcune note su Android (one touch) GestureDetector:
- evento di Android
onDoubleTap()
utilizza un valore di timeout standard dal ViewConfiguration. Mi riferisco allo stesso tempo.
- Misurano il tempo trascorso dall'evento finger-down del primo rubinetto all'evento finger-down del secondo rubinetto, quindi trasmettono
onDoubleTap()
e onDoubleTapEvent()
.
onDoubleTap()
viene generato solo quando si verifica l'evento finger-down del secondo rubinetto.
onDoubleTapEvent()
viene attivato per ogni azione dal secondo tocco: giù, sposta e su.
Alcune note su SimpleTwoFingerDoubleTapDetector:
- mio timeout viene misurata dal primo evento dito fino all'ultimo dito fino evento per evitare falsi notifiche double-tap . Ho aggiunto un po 'di tempo extra al timeout del doppio tap di ViewConfiguration predefinito per tener conto di ciò.
- GestureDetector di Android misura slop (quanto distano i due tocchi). Non ho visto il bisogno di questo qui, né ho controllato la distanza tra le due dita su ogni rubinetto.
- Trasmetto solo un evento
onTwoFingerDoubleTap()
.
Nota finale: Puoi facilmente cambiamento questo a comportarsi come un OnTouchListener:
definizione di Cambio SimpleTwoFingerDoubleTapDetector:
public abstract class SimpleTwoFingerDoubleTapListener implements OnTouchListener {
Aggiungi un nuova variabile di classe:
private View mFirstView;
Modificare il ACTION_DOWN
caso:
case MotionEvent.ACTION_DOWN:
if(mFirstDownTime == -1 || mFirstView != v || hasTimedOut(event.getEventTime())) {
mFirstView = v;
reset(event.getDownTime());
}
break;
Passo mFirstView
all'interno del ACTION_UP
caso:
onTwoFingerDoubleTap(mFirstView);
ultimo, il cambio del metodo onTwoFingerDoubleTap()
per riflettere che Visualizza è stato toccato:
public abstract void onTwoFingerDoubleTap(View v);
Questa risposta è fantastico! – dowi
Ho provato questo codice (grazie!) E non ha funzionato - stavo solo ricevendo eventi ACTION_DOWN. Credo che la funzione onTouchEvent() debba restituire True (per ACTION_DOWN) altrimenti ACTION_UP non verrà ricevuto successivamente. Fare riferimento a: http://stackoverflow.com/a/16495363/1277048 – FuzzyAmi