2012-05-04 18 views
10

Sto utilizzando un SurfaceView per visualizzare un'immagine grande (in genere più grande dello schermo, ma non sempre) in un'app Android. Questa è una grafica davvero banale, ed è facile implementare lo scorrimento usando un OnTouchListener o GestureDetector. La grafica gira in un loop Render, ma le prestazioni sembrano essere più che adeguate per tutti i dispositivi reali (l'emulatore può essere un po 'un problema, però).Implementazione di pizzico e zoom su Android SurfaceView

Sto pensando di implementare Pinch e Zoom sull'immagine, ma preferirei evitare di andare in OpenGL, poiché ho poca esperienza con OpenGL e l'uso di OpenGL sembra quasi eccessivo per qualcosa di così semplice .

Sembra che la classe android.graphics.Camera potrebbe consentirmi di implementare la funzionalità di zoom che desidero.

Qualcuno sa di buoni esempi che mostrano l'implementazione di una funzionalità simile a un pizzico di zoom su un SurfaceView Android di base?

Inoltre, se avete implementato qualcosa del genere, qualche pensiero sulle prestazioni? OpenGL vale la pena supplementare, dato che ciò che è richiesto qui è così semplice?


è la domanda poco chiara qui, o mi sto perdendo un po 'di documentazione/code assolutamente ovvio sul sito degli sviluppatori Android che avrei trovato?

+0

Sto anche cercando qualcosa di simile. Hai trovato la soluzione. Puoi per favore condividerlo – Nir

+0

Sfortunatamente, niente di ciò mi rende davvero felice. Ovviamente è possibile utilizzare lo zoom "forza bruta" (utilizzando GestureDetector), ma non è una soluzione molto buona e può richiedere un notevole dispendio di memoria. –

+0

Hmm ... dai un'occhiata a questo tutorial: http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/ Non l'ho ancora verificato, ma solo basato su una rapida occhiata, sembra promettente. –

risposta

3

OK - avendo finalmente avuto il tempo di lavorare davvero e di effettuare ricerche su questo per un certo periodo di tempo, ho effettivamente trovato una soluzione che risolve il problema che avevo.

La soluzione si basa su BitmapRegionDecoder (API10 +). Ciò che fa è consentire all'app di caricare in una parte di una bitmap, piuttosto che tentare di caricare l'intera bitmap in un colpo solo.

L'essenza della soluzione:

  1. Una versione di tutta la bitmap ricampionato rimane in memoria. Perché questa versione è downsampled, può essere mantenuta lì permanentemente.
  2. Un thread viene caricato nella finestra corrente (o un altro bit) della bitmap in memoria continuamente (utilizzando BitmapRegionDecoder). Poiché questo è al massimo leggermente più grande dello schermo, questo dovrebbe anche adattarsi comodamente alla memoria.
  3. Il thread di rendering disegna la versione appropriata sulla tela; Ad esempio, se si esegue lo zoom indietro o se la bitmap non è disponibile (ad esempio, poiché viene caricata in background), viene utilizzata la versione con downsampling.
  4. Pan, Fling e Zoom sono gestiti con GestureListeners.

Il credito va a John Lombardo per la prima implementazione dell'idea che ho trovato.

I open-source mia propria implementazione insieme ad alcuni dei miei altre classi di utilità al https://github.com/micabyte/android_game

E 'una bella recente implementazione, quindi la sua non ha avuto il battesimo del fuoco da parte degli utenti reali in questo momento. Tuttavia, ho eseguito test con la visualizzazione di bitmap da 8000x4000 pixel e finora non ho avuto problemi. Le prestazioni sembrano certamente adeguate alle mie esigenze.

+0

Progetto lib di IT – Dilip

0

L'implementazione di pizzico e zoom è qualcosa che si potrebbe fare con una combinazione di ScaleGestureDetector e l'interfaccia Canvas con una matrice di trasformazione. Dovrai utilizzare la stessa matrice di trasformazione per gestire sia la scala che la traduzione.

Problemi correlati