Domanda

sto lottando per comprendere il processo di disegno per SurfaceView e quindi l'intero sistema Surface / Canvas / Bitmap, che viene utilizzato in Android.

Ho letto tutti gli articoli e le pagine di documentazione API, che sono stato in grado di trovare sul posto, un qualche tutorial di grafica Android, codice sorgente LunarLander e questa domanda .

Ti prego, dimmi, quale di queste affermazioni sono vere, che non sono, e perché.

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

C'è anche una domanda supplementare:

  • Perché c'è la necessità di una classe Surface, se c'è già un Canvas per le operazioni ad alto livello con bitmap. Dare un esempio di una situazione in cui Canvas non è adatto a fare il lavoro che Surface può fare.
È stato utile?

Soluzione

Ecco alcune definizioni:

  • Una superficie è un oggetto che contiene pixel che vengono mescolati allo schermo. Ogni finestra che si vede sullo schermo (una finestra, la vostra attività a pieno schermo, la barra di stato) ha una sua superficie che trae in a, e Surface Flinger rende questi per la visualizzazione finale nel loro corretto ordine Z. Una superficie ha tipicamente più di un buffer (solitamente due) per fare il rendering doppio buffer: l'applicazione può essere disegnando stato successivo UI mentre flinger superficie è compositing schermo utilizzando l'ultimo tampone, senza dover attendere che l'applicazione di finitura disegno.

  • Una finestra è fondamentalmente come si pensa di una finestra sul desktop. Ha una superficie unica in cui il contenuto della finestra viene reso. Un interagisce applicazione con il window manager per creare finestre; il Window Manager crea una superficie per ogni finestra e lo dà alla domanda di disegno. L'applicazione può disegnare quello che vuole in superficie; al Window Manager è solo un rettangolo opaco.

  • A View è un elemento dell'interfaccia utente interattivo all'interno di una finestra. Una finestra ha una singola gerarchia vista collegato ad esso, che fornisce tutto il comportamento della finestra. Ogni volta che la finestra deve essere ridisegnata (ad esempio perché la vista si è invalidato), questo viene fatto nella superficie della finestra. La superficie è bloccato, che restituisce una tela che può essere utilizzato per disegnare in essa. Un attraversamento pareggio è fatto verso il basso nella gerarchia, consegnando le Canvas giù per ogni visualizzazione per disegnare una parte dell'interfaccia utente propria. Una volta fatto, la superficie è sbloccato ed ha inviato in modo che il buffer appena disegnato viene scambiato in primo piano per poi essere mescolati allo schermo di Surface Flinger.

  • Un SurfaceView è una speciale implementazione di Vista che crea anche una propria superficie dedicato per l'applicazione per disegnare direttamente in (al di fuori della normale gerarchia della vista, che altrimenti devono condividere la singola superficie per la finestra). Il modo in cui funziona è semplice di quanto si potrebbe aspettare - tutti SurfaceView non fa altro che chiedere al gestore di finestre per creare una nuova finestra, dicendogli di Z-order quella finestra o immediatamente dietro o davanti alla finestra del SurfaceView, e posizionandolo a partita dove il SurfaceView appare nella finestra che contiene. Se la superficie viene posta dietro la finestra principale (in ordine Z), SurfaceView riempie anche parte della finestra principale con trasparenza in modo che la superficie può essere visto sua.

  • Una bitmap è solo un'interfaccia per alcuni dati pixel. I pixel possono essere assegnati da bitmap sé quando si crea direttamente uno, o può essere punta di pixel non possiede come ciò che accade internamente per agganciare un tela fino a una superficie per il disegno. (A bitmap viene creata e indicò il buffer disegno corrente della superficie.)

Inoltre si prega di tenere presente che, come questo implica, un SurfaceView è un oggetto pesante abbastanza. Se si dispone di più SurfaceViews in un'interfaccia utente particolare fermarsi e riflettere sul fatto che questo è veramente necessario. Se si dispone di più di due, quasi certamente avere troppi.

Altri suggerimenti

Un panoramica concettuale di Window, di superficie, di tela, e 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 potrebbe aiutare qualcuno.

Una bitmap è semplicemente un wrapper per un insieme di pixel. Pensare ad esso come una matrice di pixel con alcune altre funzioni utili.

La tela è semplicemente la classe che contiene tutti i metodi di disegno. E 'simile alla classe Graphics in AWT / Swing se si ha familiarità con questo. Tutta la logica su come disegnare un cerchio, o di una scatola, ecc è contenuta all'interno della tela. Una tela si basa su una bitmap o un contenitore GL aperta, ma non v'è 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 un bitmap (che ha un negozio pixel). Non so come viene attuata, ma mi immagino che è una sorta di involucro bitmap con i metodi aggiuntivi per le cose che sono direttamente collegati ai display a schermo (Questo è il motivo per una superficie, un bitmap è troppo generico). È possibile ottenere una tela dalla superficie che è davvero sempre Canvas associati al bitmap sottostante.

Le tue domande.

1.Canvas ha una propria bitmap collegato ad esso. Surface ha la propria Canvas collegato ad esso.

Sì, una tela opera su una bitmap (o un pannello GL aperto). Superficie ti dà una tela che opera su qualunque superficie sta usando per il suo negozio di pixel stile bitmap.

di finestra quota 2.All Visualizza la stessa superficie e quindi condividere lo stesso della tela di canapa.

No. Si potrebbe avere come molti punti di vista di superficie che si desidera.

3.SurfaceView è sottoclasse di vista, che, a differenza di altri sottoclassi e la vista stessa di Vista, ha una propria superficie per disegnare in.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top