JavascriptProva

sabato 23 aprile 2016

Pinch Zoom

Bisogna istanziare un oggetto di tipo GestureDetector.
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 Difficile da ricordare? Simple On, poi ScaleGesture, poi Listener (perché si tratta di un Listener).

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.0016569

Esperimento riuscito!

Nessun commento:

Posta un commento