2010-04-15 9 views
10

Volevo solo sapere se esiste un qualche tipo di classe per utilizzare le funzionalità multitouch di Android 2.1. Nello specifico, sto cercando di implementare il pinch-zoom e mi chiedevo se devo sempre misurare la distanza tra due eventi touch e calcolare il livello di zoom per conto mio?Esiste un'API integrata per la gestione della funzionalità di zoom pinch in Android

Grazie, Chris

+1

Sto iniziando da solo su Android Dev stuff, se non ce n'è uno, questa sarebbe una grande opportunità per avviarne uno e renderlo disponibile agli altri. – onaclov2000

+0

Sembra che tu stia confondendo il termine "multitouch". Quello che stai chiedendo in particolare è la funzionalità "pizzica zoom". Quale è una delle cose che possono essere compiute usando il multitouch. La funzionalità multitouch è semplicemente la capacità di rilevare due o più eventi touch sullo schermo contemporaneamente. –

risposta

1

Ci sono stati hack creati da sviluppatori che consentono multitouch sul browser e il browser Dolphin. Sono disponibili in rom personalizzate e sono sicuro che sono scaricabili.

Anche Google ha rilasciato ufficialmente il multi-touch sul Nexus One e Motorola sul loro traguardo. Ciò significa che dovresti essere in grado di ottenere una classe ufficiale per questo, ma scommetto che è per la versione 2.1 di Android.

Inoltre, penso che sarebbe sicuro assumere che si desidera che questo funzioni sui telefoni rooted. Ciò significa che potresti essere bloccato a utilizzare Android 2.1 e forse fino a 2.0.

+0

La domanda riguarda lo sviluppo di Android. Questo sito riguarda lo sviluppo del software. La tua risposta è per gli utenti finali. – CommonsWare

+0

@CommonsWare: si tratta molto dello sviluppo del software. Se l'API non è presente per Android 2.0 ma è per Android 2.1, influisce sul risultato del suo sviluppo. –

4

Credo che dovrai calcolare tu stesso il livello di zoom. Questo articolo sembra una buona risorsa per iniziare: http://blogs.zdnet.com/Burnette/?p=1847

+1

Penso che Ed Burnette (autore di quel post) vada più in dettaglio nella sua imminente terza edizione del suo libro, Hello, Android. – CommonsWare

15

Sto provando a fare la stessa cosa, e come al solito il mio primo istinto è stato quello di esaminare il codice sorgente di Android stesso. I bit interessanti sembrano essere in classe ScaleGestureDetector, che non è pubblico, ma la sua javadoc dice approvazione

@hide attesa API

quindi speriamo che diventi pubblico ad un certo punto.

Aggiornamento: ScaleGestureDetector è ora parte del Android 2.2 API.

0

Stai cercando di ingrandire un'immagine? Come soluzione semplice, è possibile utilizzare una WebView per visualizzare l'immagine, dotata di funzionalità pinch-zoom integrata.

3

Dipende dalla versione di Android che desideri utilizzare come target.

  • 2.2 o più recente - utilizzare il dispositivo ScaleGestureDetector incorporato. Il javadoc è molto utile, ma vedi l'esempio qui sotto.
  • 2.0-2.2 - ScaleGestureDetector non è integrato, quindi copy the version from Android e compilarlo nell'applicazione.
  • pre-2.0 - Mutitouch non era supportato prima 2.0, quindi è necessario copy ScaleGestureDetector.java from Android e fare un po 'di lavoro di non utilizzare le API multitouch su dispositivi non supportati:

Per evitare di utilizzare le API multitouch su pre- Dispositivi 2.0, è necessario creare un'interfaccia per ScaleGestureDetector (Eclipse può farlo tramite il menu Refactor) e un'implementazione fittizia che i dispositivi 1.x useranno. Chiameremo la nostra interfaccia ScaleGestureDetectorInterface e la nostra implementazione fittizia FakeScaleGestureDetector.

Ecco un esempio di supporto pre-2.0 dispositivi:

// If you don't care about pre-2.0 devices, just make this a 
// ScaleGestureDetector and skip the API check in the constructor. 
private final ScaleGestureDetectorInterface mScaleDetector; 

public MyView { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) { 
     // Use the fake version which won't call any multitouch APIs 
     mScaleDetector = new FakeScaleGestureDetector(); 
    } else { 
     // We are using SDK 2.0+, use the real implementation. 
     mScaleDetector = new ScaleGestureDetector(context, 
      new MyScaleListener()); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // On pre-2.0, the implementation does nothing. 
    return mScaleDetector.onTouchEvent(event); 
} 

private class MyScaleListener extends 
     ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureInterface detector) { 
     float scaleFactor = detector.getScaleFactor(); 
     // If you were using a matrix to zoom an ImageView, you would do 
     // something like this: 
     mMatrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(), 
      detector.getFocusY()); 
     return true; 
    } 
} 
Problemi correlati