Ich habe Probleme, den Prozess des Zeichnens SurfaceView
und damit das gesamte Surface
// Canvas
/ Bitmap
System zu verstehen , das in Android verwendet wird.
Ich habe alle Artikel und API-Dokumentationsseiten gelesen, die ich auf der Website von Android-Entwicklern finden konnte, einige Tutorials zu Android-Grafiken, LunarLander-Quellcode und diese Frage .
Bitte sagen Sie mir, welche dieser Aussagen wahr sind, welche nicht und warum.
Canvas
hat seine eigene daranBitmap
gebunden.Surface
hat seine eigene daranCanvas
gebunden.- Alle
View
Fenster teilen sich das gleicheSurface
und somit das gleicheCanvas
. SurfaceView
ist eine Unterklasse vonView
, die im Gegensatz zuView
den Unterklassen anderer und sichView
selbst ihre eigeneSurface
zu zeichnen hat.
Es gibt noch eine zusätzliche Frage:
- Warum wird eine
Surface
Klasse benötigt, wenn es bereits eineCanvas
für Operationen auf hoher Ebene mit Bitmap gibt? Geben Sie ein Beispiel für eine Situation, in derCanvas
es nicht für Arbeiten geeignet ist, die ausgeführt werdenSurface
können.
android
android-canvas
surfaceview
fyodorananiev
quelle
quelle
Antworten:
Hier sind einige Definitionen:
Eine Oberfläche ist ein Objekt, das Pixel enthält, die auf dem Bildschirm zusammengesetzt werden. Jedes Fenster, das Sie auf dem Bildschirm sehen (ein Dialogfeld, Ihre Vollbildaktivität, die Statusleiste), hat eine eigene Oberfläche, in die es gezeichnet wird, und Surface Flinger rendert diese in der richtigen Z-Reihenfolge zur endgültigen Anzeige. Eine Oberfläche verfügt normalerweise über mehr als einen Puffer (normalerweise zwei), um doppelt gepuffert zu rendern: Die Anwendung kann ihren nächsten UI-Status zeichnen, während der Oberflächen-Flinger den Bildschirm mit dem letzten Puffer zusammensetzt, ohne auf den Abschluss der Anwendung warten zu müssen Zeichnung.
Ein Fenster ist im Grunde so, als würden Sie an ein Fenster auf dem Desktop denken. Es hat eine einzelne Oberfläche, in der der Inhalt des Fensters gerendert wird. Eine Anwendung interagiert mit dem Fenstermanager, um Fenster zu erstellen. Der Fenstermanager erstellt für jedes Fenster eine Oberfläche und gibt sie der Anwendung zum Zeichnen. Die Anwendung kann in der Oberfläche zeichnen, was sie will. Für den Fenstermanager ist es nur ein undurchsichtiges Rechteck.
Eine Ansicht ist ein interaktives UI-Element innerhalb eines Fensters. An ein Fenster ist eine einzelne Ansichtshierarchie angehängt, die das gesamte Verhalten des Fensters bereitstellt. Wann immer das Fenster neu gezeichnet werden muss (z. B. weil sich eine Ansicht selbst ungültig gemacht hat), erfolgt dies in der Fensteroberfläche. Die Oberfläche ist gesperrt, wodurch eine Leinwand zurückgegeben wird, auf der gezeichnet werden kann. Eine Zeichnungsdurchquerung wird entlang der Hierarchie durchgeführt, wobei die Leinwand für jede Ansicht übergeben wird, um ihren Teil der Benutzeroberfläche zu zeichnen. Sobald dies erledigt ist, wird die Oberfläche entsperrt und veröffentlicht, sodass der gerade gezeichnete Puffer in den Vordergrund verschoben wird, um dann von Surface Flinger auf dem Bildschirm zusammengesetzt zu werden.
Eine SurfaceView ist eine spezielle Implementierung von View, die auch eine eigene dedizierte Oberfläche erstellt, in die die Anwendung direkt zeichnen kann (außerhalb der normalen Ansichtshierarchie, die andernfalls die einzelne Oberfläche für das Fenster gemeinsam nutzen muss). Die Funktionsweise ist einfacher als erwartet. SurfaceView fordert den Fenstermanager lediglich auf, ein neues Fenster zu erstellen, das Fenster entweder direkt hinter oder vor dem SurfaceView-Fenster in Z-Reihenfolge anzuordnen und entsprechend zu positionieren wo die SurfaceView im enthaltenden Fenster erscheint. Wenn die Oberfläche hinter dem Hauptfenster platziert wird (in Z-Reihenfolge), füllt SurfaceView auch seinen Teil des Hauptfensters mit Transparenz, damit die Oberfläche sichtbar ist.
Eine Bitmap ist nur eine Schnittstelle zu einigen Pixeldaten. Die Pixel werden möglicherweise von Bitmap selbst zugewiesen, wenn Sie direkt eines erstellen, oder es zeigt auf Pixel, die es nicht besitzt, z. B. was intern passiert, wenn ein Canvas zum Zeichnen an eine Oberfläche angeschlossen wird. (Eine Bitmap wird erstellt und zeigt auf den aktuellen Zeichenpuffer der Oberfläche.)
Beachten Sie auch, dass ein SurfaceView, wie dies impliziert, ein ziemlich schweres Objekt ist. Wenn Sie mehrere SurfaceViews in einer bestimmten Benutzeroberfläche haben, halten Sie inne und überlegen Sie, ob dies wirklich erforderlich ist. Wenn Sie mehr als zwei haben, haben Sie mit ziemlicher Sicherheit zu viele.
quelle
#hackbod's
AntwortSurfaceView
kann auch aus einem sekundären Thread gerendert werden, der fürView
Objekte nicht möglich istHier finden Sie eine sehr einfache und einfache konzeptionelle Übersicht darüber, wie die Interaktion zwischen Fenster, Oberfläche, Leinwand und Bitmap abläuft.
Manchmal hilft eine visuelle Darstellung sehr beim Verständnis verdrehter Konzepte.
Ich hoffe diese Grafik konnte jemandem helfen.
quelle
Eine Bitmap ist einfach ein Wrapper für eine Sammlung von Pixeln. Stellen Sie sich das als eine Reihe von Pixeln mit einigen anderen praktischen Funktionen vor.
Der Canvas ist einfach die Klasse, die alle Zeichenmethoden enthält. Es ähnelt der Grafikklasse in AWT / Swing, wenn Sie damit vertraut sind. Die gesamte Logik zum Zeichnen eines Kreises, einer Box usw. ist in Canvas enthalten. Eine Leinwand zeichnet auf eine Bitmap oder einen offenen GL-Container, aber es gibt keinen Grund, warum sie in Zukunft erweitert werden könnte, um auf andere Arten von Rastern zu zeichnen.
SurfaceView ist eine Ansicht, die eine Oberfläche enthält. Eine Oberfläche ähnelt einer Bitmap (sie hat einen Pixelspeicher). Ich weiß nicht, wie es implementiert ist, aber ich würde mir vorstellen, dass es sich um eine Art Bitmap-Wrapper mit zusätzlichen Methoden für Dinge handelt, die in direktem Zusammenhang mit Bildschirmanzeigen stehen (das ist der Grund für eine Oberfläche, eine Bitmap ist zu allgemein). Sie können eine Leinwand von Ihrer Oberfläche erhalten, die wirklich die Leinwand erhält, die der zugrunde liegenden Bitmap zugeordnet ist.
Deine Fragen.
Ja, eine Zeichenfläche wird mit einer Bitmap (oder einem offenen GL-Bedienfeld) bearbeitet. Mit Surface erhalten Sie eine Leinwand, die auf jeder Oberfläche ausgeführt wird, die für den Pixelspeicher im Bitmap-Stil verwendet wird.
Nein. Sie können so viele Oberflächenansichten haben, wie Sie möchten.
Ja. Genau wie ListView ist es eine Unterklasse von View, die eine eigene Listendatenstruktur hat. Jede Unterklasse von View macht etwas anderes.
quelle
Bitmap
undSurface
sind nur verschiedene Arten von Pixelspeicher undCanvas
können beide umschließen?