Risposte:
Le viste sono tutte disegnate sullo stesso thread della GUI che viene utilizzato anche per tutte le interazioni dell'utente.
Pertanto, se è necessario aggiornare la GUI rapidamente o se il rendering richiede troppo tempo e influisce sull'esperienza utente, utilizzare SurfaceView
.
Alcune cose che ho notato:
Per ulteriori informazioni (e un ottimo esempio di utilizzo) consultare il progetto LunarLander nella sezione degli esempi dell'SDK.
aggiornato il 05/09/2014
OK. Abbiamo un documento ufficiale ora. Ha parlato di tutto ciò che ho menzionato, in un modo migliore.
Leggi più dettagliati qui .
Sì, la differenza principale è che SurfaceView può essere aggiornato sul thread in background. Tuttavia, ci sono molte altre che potrebbero interessarti.
surfaceView ha un buffer di superficie dedicato mentre tutta la vista condivide un buffer di superficie allocato da ViewRoot. In altre parole, surfaceView costa più risorse.
surfaceView non può essere accelerato dall'hardware (a partire da JB4.2) mentre le operazioni del 95% nella visualizzazione normale sono accelerate HW usando openGL ES.
Dovresti fare più lavoro per creare il tuo SurfaceView personalizzato. Devi ascoltare l'evento surfaceCreated / Destroy, creare un thread di rendering e, soprattutto, sincronizzare il thread di rendering e il thread principale. Tuttavia, per personalizzare la vista, tutto ciò che devi fare è sostituire il onDraw
metodo.
view.invalidate
nel thread dell'interfaccia utente o view.postInvalid
in un altro thread per indicare al framework che la vista deve essere aggiornata. Tuttavia, la vista non verrà aggiornata immediatamente ma attendere fino all'arrivo del prossimo evento VSYNC. L'approccio semplice per comprendere VSYNC è considerare che è come un timer che si accende ogni 16 ms per uno schermo a 60 fps. In Android, tutto il normale aggiornamento della vista (e visualizzato effettivamente ma non lo parlerò oggi), è sincronizzato con VSYNC per ottenere una migliore scorrevolezza. Ora, tornando a SurfaceView, puoi renderizzarlo quando vuoi. Tuttavia, non riesco a capire se sia un vantaggio, poiché il display è anche sincronizzato con VSYNC, come affermato in precedenza.La differenza principale è che SurfaceView
possono essere disegnati dai thead di sfondo ma Views
non possono.
SurfaceViews
usa più risorse, quindi non vuoi usarle a meno che non sia necessario.
A SurfaceView
è una vista personalizzata in Android che può essere utilizzata per disegnare al suo interno.
La differenza principale tra a View
e a SurfaceView
è che viene disegnata una vista in
UI Thread
, che viene utilizzata per tutte le interazioni dell'utente.
Se desideri aggiornare l'interfaccia utente abbastanza rapidamente e visualizzare una buona quantità di informazioni al suo interno, SurfaceView è la scelta migliore.
Ma ci sono alcuni aspetti tecnici di SurfaceView
:
1. Non sono accelerati dall'hardware.
2. Le viste normali vengono visualizzate quando si chiamano i metodi invalidate
o postInvalidate()
, ma ciò non significa che la vista verrà immediatamente aggiornata ( VSYNC
verrà inviato A e il sistema operativo deciderà quando verrà aggiornato. Il SurfaceView
può essere immediatamente aggiornato.
3. Un SurfaceView ha un allocato surface buffer
, quindi è più costoso
Una delle principali differenze tra surfaceview e view è che per aggiornare lo schermo per una visualizzazione normale dobbiamo chiamare il metodo invalidato dallo stesso thread in cui è definita la vista. Ma anche se chiamiamo invalidato, l'aggiornamento non avviene immediatamente. Si verifica solo dopo il prossimo arrivo del segnale VSYNC. Il segnale VSYNC è un segnale generato dal kernel che si verifica ogni 16,6 ms o questo è anche noto come 60 frame al secondo. Quindi, se vogliamo un maggiore controllo sull'aggiornamento dello schermo (ad esempio per l'animazione in movimento molto veloce), non dovremmo usare la normale classe di visualizzazione.
D'altra parte, nel caso di Surfaceview, possiamo aggiornare lo schermo il più velocemente possibile e possiamo farlo da un thread in background. Quindi l'aggiornamento del Surfaceview in realtà non dipende da VSYNC, e questo è molto utile se vogliamo fare un'animazione ad alta velocità. Ho alcuni video di formazione e applicazioni di esempio che spiegano bene tutte queste cose. Dai un'occhiata ai seguenti video di formazione.
Perché usare SurfaceView e non la classica classe View ...
Uno dei motivi principali è che SurfaceView può eseguire rapidamente il rendering dello schermo.
In parole semplici, un SV è più in grado di gestire i tempi e il rendering delle animazioni.
Per comprendere meglio cos'è un SurfaceView dobbiamo confrontarlo con la classe View.
Qual è la differenza ... controlla questa semplice spiegazione nel video
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Bene con il View abbiamo un grosso problema .... i tempi di rendering delle animazioni.
Normalmente onDraw () viene chiamato dal sistema runtime di Android.
Quindi, quando il sistema runtime di Android chiama onDraw (), l'applicazione non può controllare
i tempi di visualizzazione, e questo è importante per l'animazione. Abbiamo un intervallo di tempo
tra l'applicazione (il nostro gioco) e il sistema di runtime Android.
L'SV può chiamare onDraw () da un thread dedicato.
Pertanto: l'applicazione controlla i tempi. Quindi possiamo visualizzare l'immagine bitmap successiva dell'animazione.