Non è difficile memorizzarlo: Gesture Detector, ossia detettore di gesti.
Questo richiede come parametri, a parte il Context, un Listener che sarebbe, credo, un metodo del Gesture Detector stesso.
Provo a scrivere il codice di istanziazione del Gesture Detector per lo scaling, che si chiama ScaleGestureDetector (anche questo facile da ricordare, scomponendo in Scale, Gesture e Detector)
ScaleGestureDetector scaleGestureDetector= new ScaleGestureDetector(this,new ScaleListener());Ecco: ScaleListener non è conosciuto dal programma. Si tratta di una classe che estende un metodo di ScaleGestureDetector stesso, che sarebbe SimpleOnScaleGestureListener.b
Lo scrivo a memoria (si spera):
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{ }Bene, nessun segno di errore!
Ora, questa classe overridda il metodo onScale il quale ha per parametro un oggetto di tipo ScaleGestureDetector, che sarebbe lo stesso oggetto che ha per parametro questo listener...
Il metodo onScale è booleano.
Viene immediata l'aggiunta di un return con valore booleano, suggerita direttamente da Eclipse.
Manca la linea fondamentale del metodo, che restituisce un float scale, che dovrebbe essere il risultato del metodo getScaleFactor del detector che il metodo onScale ha per parametro.
Provo a scriverlo.
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{ @Override public boolean onScale(ScaleGestureDetector detector){ float scale=detector.getScaleFactor(); return true; } }
Mandala! Cancello e riscrivo tutto.
ScaleGestureDetector detector=new ScaleGestureDetector(this,new ScaleListener()); } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{ @Override public boolean onScale(ScaleGestureDetector detector){ float scale=detector.getScaleFactor(); return true; } }Non male.
Ci riprovo ancora:
ScaleGestureDetector detector=new ScaleGestureDetector(this,new ScaleListener()); } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{ @Override public boolean onScale(ScaleGestureDetector detector){ float scale=detector.getScaleFactor(); return true; } }Okay!
Ora vediamo cosa dobbiamo fare con questo "manoscritto"!
Ecco: mi sembra che la chiave di tutto sia l'evento TouchEvent, nel quale al tocco si subordina il tocco dello ScaleGestureDetector.
Scrivo l'evento TouchEvent così organizzato:
public boolean onTouchEvent(MotionEvent ev) { SGD.onTouchEvent(ev); return true; }In pratica, se con l'evento onTouchEvent si intercetta l'evento onTouchEvent a carico dello ScaleGestureDetector, questo invia il messaggio all'evento onScale del Listener (ScaleListener che estende ScaleGestureDetector.SimpleOnScaleGestureListener.
Aggiungiamo quindi le istruzioni da eseguire nell'evento onScale di ScaleListener:
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector){
float scale=detector.getScaleFactor();
Log.v("Scale",""+scale);
return true;
}
}
Le istruzioni sono quelle poste in rosso.Non potendo eseguire un pinch zoom con l'emulatore, eseguo il codice sul cellulare, e ottengo in Logcat i valori della scala nel corso del movimento delle due dita:
04-23 19:28:57.080: V/Scale(28619): 1.0 04-23 19:28:57.093: V/Scale(28619): 1.0199716 04-23 19:28:57.117: V/Scale(28619): 1.0195951 04-23 19:28:57.134: V/Scale(28619): 1.011993 04-23 19:28:57.151: V/Scale(28619): 1.007305 04-23 19:28:57.168: V/Scale(28619): 1.0048231 04-23 19:28:57.184: V/Scale(28619): 1.0063298 04-23 19:28:57.202: V/Scale(28619): 1.0045882 04-23 19:28:57.218: V/Scale(28619): 1.001444 04-23 19:28:57.235: V/Scale(28619): 1.0050373 04-23 19:28:57.252: V/Scale(28619): 1.0011859 04-23 19:28:57.269: V/Scale(28619): 1.0034686 04-23 19:28:57.286: V/Scale(28619): 1.0094994 04-23 19:28:57.302: V/Scale(28619): 1.0016569Esperimento riuscito!
Nessun commento:
Posta un commento