2011-01-02 18 views
98

Non riesco a capire il processo di disegno su SurfaceView e quindi l'intero sistema Surface/Canvas/Bitmap, utilizzato in Android.Comprensione dei concetti di superficie e tela

Ho letto tutti gli articoli e le pagine di documentazione API, che sono stato in grado di trovare sul sito di sviluppatori Android, alcuni tutorial di grafica Android, codice sorgente LunarLander e this question.

Per favore dimmi, quali di queste affermazioni sono vere, quali no, e perché.

  1. Canvas ha il proprio Bitmap collegato ad esso. Surface ha il proprio Canvas collegato ad esso.
  2. Tutti gli View di finestra condividono lo stesso Surface e quindi condividono lo stesso Canvas.
  3. SurfaceView è sottoclasse di View, che, a differenza sottoclassi s' altri View e View in sé, ha una propria Surface a disegnare in

C'è anche una domanda supplementare:.

  • Perché Esiste la necessità di una classe Surface, se esiste già una Canvas per operazioni di alto livello con bitmap. Fornire un esempio di una situazione in cui Canvas non è adatto per eseguire operazioni che possono essere eseguite da Surface.
+1

Architettura grafica doc: https://source.android.com/devices/graphics/architecture.html – fadden

risposta

193

Ecco alcune definizioni:

  • Una superficie è un oggetto che contiene pixel che vengono mescolati allo schermo. Ogni finestra che vedi sullo schermo (una finestra di dialogo, l'attività a schermo intero, la barra di stato) ha la sua superficie a cui attinge, e Surface Flinger li rende alla visualizzazione finale nell'ordine Z corretto. In genere una superficie ha più di un buffer (di solito due) per il rendering a doppio buffer: l'applicazione può disegnare il suo prossimo stato dell'interfaccia utente mentre il flinger di superficie sta compositing lo schermo utilizzando l'ultimo buffer, senza dover attendere che l'applicazione finisca disegno.

  • Una finestra è fondamentalmente come se si pensasse di una finestra sul desktop. Ha una singola superficie in cui viene eseguito il rendering dei contenuti della finestra. Un'applicazione interagisce con Window Manager per creare finestre; il Gestore finestre crea una superficie per ogni finestra e la consegna all'applicazione per il disegno. L'applicazione può disegnare ciò che vuole in Surface; al Window Manager è solo un rettangolo opaco.

  • Una vista è un elemento dell'interfaccia utente all'interno di una finestra. Una finestra ha una sola gerarchia di viste ad essa collegata, che fornisce tutto il comportamento della finestra. Ogni volta che la finestra deve essere ridisegnata (come nel caso in cui una vista si è invalidata), questa viene eseguita nella superficie della finestra. La superficie è bloccata, che restituisce una tela che può essere utilizzata per disegnarla. Una traversata di sorteggio viene eseguita lungo la gerarchia, passando la tela verso il basso per ciascuna vista per tracciare la sua parte dell'interfaccia utente. Una volta fatto, Surface viene sbloccato e postato in modo tale che il buffer appena estratto sia scambiato in primo piano per essere poi composto sullo schermo da Surface Flinger.

  • Un SurfaceView è un'implementazione speciale di View che crea anche il proprio Surface dedicato per l'applicazione a cui attingere direttamente (al di fuori della normale gerarchia delle viste, che altrimenti deve condividere la singola Superficie per la finestra). Il modo in cui funziona è più semplice di quanto ci si possa aspettare - tutto ciò che SurfaceView fa è chiedere al window manager di creare una nuova finestra, ordinando a Z quella finestra immediatamente dietro o davanti alla finestra di SurfaceView e posizionandola in modo corrispondente dove SurfaceView appare nella finestra di contenimento. Se la superficie viene posizionata dietro la finestra principale (in ordine Z), SurfaceView riempie anche la sua parte della finestra principale con trasparenza in modo che la superficie possa essere vista.

  • Una bitmap è solo un'interfaccia per alcuni dati di pixel. I pixel possono essere allocati da Bitmap stesso quando ne crei uno direttamente, oppure potrebbe puntare a pixel che non possiede come quello che accade internamente per agganciare una tela a una superficie per disegnare. (A bitmap viene creata e indicò il buffer disegno corrente della superficie.)

anche perche tenere presente che, come questo implica, un SurfaceView è un oggetto abbastanza pesante. Se hai più SurfaceViews in una particolare interfaccia utente, fermati e pensa se è davvero necessario. Se ne hai più di due, ne hai quasi sicuramente troppe.

+0

Grazie mille! La risposta ha reso le cose più chiare. Una parte dell'aggancio di Canvas to Surface non è chiara, tuttavia. Non riesco a immaginare dove sia necessaria tale operazione. Può essere il prossimo esempio di tale operazione: disegnare Bitmap su un Canvas, acquisito da SurfaceHolder con il metodo lockCanvas()? – fyodorananiev

+0

Ecco come avviene il disegno Canvas è l'API di disegno 2D. Se vuoi disegnare o su una superficie, devi disegnare una tela che punta al suo buffer per usare l'API di disegno Canvas 2d per disegnarla. – hackbod

+4

Oltre alla risposta '# hackbod's',' SurfaceView' può anche essere renderizzato dal thread secondario che non è possibile per gli oggetti 'View' – dheeran

15

Una bitmap è semplicemente un wrapper per una raccolta di pixel. Pensala come una serie di pixel con altre utili funzioni.

Canvas è semplicemente la classe che contiene tutti i metodi di disegno. È simile alla classe Graphics in AWT/Swing se si ha familiarità con questo. Tutta la logica su come disegnare un cerchio, una scatola, ecc. È contenuta all'interno di Canvas. Una tela si basa su un Bitmap o un contenitore GL aperto, ma non vi è alcun motivo per cui in futuro potrebbe essere esteso per disegnare su altri tipi di raster.

SurfaceView è una vista che contiene una superficie. Una superficie è simile a una bitmap (ha un archivio di pixel). Non so come sia implementato, ma immagino che sia una sorta di wrapper Bitmap con metodi aggiuntivi per cose direttamente correlate alle schermate (questa è la ragione per cui una superficie, una bitmap è troppo generica). Puoi ottenere una tela dalla tua superficie che sta davvero ricevendo la tela associata alla bitmap sottostante.

Le vostre domande.

1. Canan ha la propria Bitmap allegata. Surface ha il suo Canvas collegato ad esso.

Sì, un quadro funziona su un Bitmap (o un pannello GL aperto). Surface ti offre una Canvas che funziona su qualsiasi superficie che usa per il suo store pixel in stile Bitmap.

2. Tutte le finestre di View condividono la stessa superficie e quindi condividono la stessa tela.

No. Potresti avere tante visualizzazioni di superfici quante ne vuoi.

3.SurfaceView è sottoclasse di vista, che, a differenza di altre sottoclassi di vista e vedere se stesso, ha la sua superficie per disegnare in.

Sì. Proprio come ListView è una sottoclasse di View che ha la sua struttura dati List. Ogni sottoclasse di View fa qualcosa di diverso.

+0

Quindi, 'Bitmap' e' Surface' sono solo diverse specie di pixel store e 'Canvas' può avvolgere entrambi ? – fyodorananiev

+2

Fondamentalmente si. Ad eccezione del fatto che Canvas non può scrivere su una superficie, funziona su qualunque cosa Surface stia usando come proprio archivio di pixel (senza guardare la fonte Android non posso dire per certo di cosa sia). Probabilmente è una specie di estensione Bitmap poiché Canvas fornisce solo costruttori per Bitmap e GL. – monkjack

+0

Un grande aiuto, grazie! Informazioni sulla risposta 2. Nella mia domanda intendevo le viste standard, non SurfaceViews. Supponiamo di avere RelativeLayout con molti campi e pulsanti. In questo caso, Surface è collegato all'intera finestra e condiviso da tutte le viste nella gerarchia di viste? – fyodorananiev

25

A conceptual overview of Window, Surface, Canvas, and Bitmap

Ecco una panoramica concettuale molto essenziale e semplice di come avviene l'interazione tra la finestra, di superficie, di tela, e Bitmap.
A volte, una rappresentazione visiva aiuta molto nella comprensione di concetti contorti.
Spero che questo grafico possa aiutare qualcuno.

+2

Visualy ** Immagini ** sono meglio del testo: D – Gattsu

+0

@Sabeesh: buon lavoro! !! –