Leinwand und Oberflächenkonzepte verstehen
-
14-10-2019 - |
Frage
Ich kämpfe darum, den Prozess des Zeichnens zu verstehen SurfaceView
und damit das Ganze Surface
/Canvas
/Bitmap
System, 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 mit Android-Grafiken, Lunarlander-Quellcode und diese Frage.
Bitte sagen Sie mir, welche dieser Aussagen sind wahr, was nicht und warum.
Canvas
hat sein eigenesBitmap
angehängt an.Surface
hat sein eigenesCanvas
angehängt an.- Alle
View
Das Fenster teilen dasselbeSurface
und somit dasselbe teilenCanvas
. SurfaceView
ist Unterklasse vonView
, was im Gegensatz zu anderenView
Unterklassen undView
selbst hat seine eigeneSurface
Zeichnen.
Es gibt auch eine zusätzliche Frage:
- Warum ist es Bedarf an a
Surface
Klasse, wenn es bereits ein gibtCanvas
Für hochrangige Operationen mit Bitmap. Geben Sie ein Beispiel für eine Situation, in derCanvas
ist nicht arbeitsfähig für die Arbeit, dieSurface
tun können.
Lösung
Hier sind einige Definitionen:
Eine Oberfläche ist ein Objekt, das Pixel hält, die auf den Bildschirm zusammengesetzt werden. Jedes Fenster, das Sie auf dem Bildschirm sehen (ein Dialog, Ihre Vollbildaktivität, die Statusleiste), hat eine eigene Oberfläche, die sich anzieht, und Oberflächenflinger übertragen diese in der endgültigen Anzeige in ihrem richtigen Z-Befehl. Eine Oberfläche hat normalerweise mehr als einen Puffer (normalerweise zwei), um das doppelt gepufferte Rendering durchzuführen: Die Anwendung kann ihren nächsten UI Zeichnung.
Ein Fenster ist im Grunde genommen wie Sie an ein Fenster auf dem Desktop denken. Es hat eine einzelne Oberfläche, auf der der Inhalt des Fensters gerendert wird. Eine Anwendung interagiert mit dem Fenstermanager, um Windows zu erstellen. Der Fenstermanager erstellt für jedes Fenster eine Oberfläche und gibt sie der Anwendung zum Zeichnen. Die Anwendung kann alles in der Oberfläche zeichnen; Für den Fenstermanager ist es nur ein undurchsichtiges Rechteck.
Eine Ansicht ist ein interaktives UI -Element in einem Fenster. Ein Fenster hat eine einzelne Ansichtshierarchie, die das gesamte Verhalten des Fensters liefert. Immer wenn das Fenster neu gezogen werden muss (z. Die Oberfläche ist gesperrt, was eine Leinwand zurückgibt, mit der sie hineingezogen werden können. Eine Ziehung durch die Hierarchie erfolgt und gibt die Leinwand für jede Ansicht nach unten, um ihren Teil der Benutzeroberfläche zu zeichnen. Sobald die Oberfläche abgeschlossen ist, wird die Oberfläche freigeschaltet und gepostet, damit der gerade gezogene Puffer in den Vordergrund ausgetauscht wird, um dann mit Oberflächenmesser auf den Bildschirm zu verdienen.
Eine SurfaceView ist eine spezielle Implementierung der Sichtweise, die auch eine eigene dedizierte Oberfläche erstellt, damit die Anwendung direkt in die Normalansichtshierarchie einzieht, die ansonsten die einzelne Oberfläche für das Fenster teilen muss). Die Art und Weise, wie dies funktioniert wo der Surfaceview im enthaltenden Fenster angezeigt wird. Wenn die Oberfläche hinter dem Hauptfenster (in z -Reihenfolge) platziert wird, füllt SurfaceView auch ihren Teil des Hauptfensters mit Transparenz, so dass die Oberfläche ersichtlich ist.
Eine Bitmap ist nur eine Schnittstelle zu einigen Pixeldaten. Die Pixel können durch Bitmap selbst zugeteilt werden, wenn Sie direkt eines erstellen, oder es kann auf Pixel zeigen, die sie nicht besitzen, z. B. das, was intern eine Leinwand zum Zeichnen an einer Oberfläche geschieht. (Eine Bitmap wird erstellt und auf den Stromzeichnungspuffer der Oberfläche hingewiesen.)
Beachten Sie auch, dass eine Surfaceview, wie dies schon sagt, ein ziemlich schweres Objekt ist. Wenn Sie mehrere Surfaceviews in einer bestimmten Benutzeroberfläche haben, halten Sie an und denken Sie darüber nach, ob dies wirklich benötigt wird. Wenn Sie mehr als zwei haben, haben Sie mit ziemlicher Sicherheit zu viele.
Andere Tipps
Eine Bitmap ist einfach eine Wrapper für eine Sammlung von Pixeln. Betrachten Sie es als eine Reihe von Pixeln mit einigen anderen bequemen Funktionen.
Die Leinwand 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 oder eines Boxs usw. ist in Leinwand enthalten. Eine Leinwand zeichnet auf eine Bitmap oder einen offenen GL -Behälter, aber es gibt keinen Grund, warum es in Zukunft erweitert werden kann, um auf andere Arten von Rastern zu ziehen.
SurfaceView ist eine Ansicht, die eine Oberfläche enthält. Eine Oberfläche ähnelt einer Bitmap (sie hat einen Pixelgeschäft). 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 direkt mit Bildschirmanzeigen zusammenhängen (das ist der Grund für eine Oberfläche, eine Bitmap ist zu generisch). Sie können eine Leinwand von Ihrer Oberfläche erhalten, die die Leinwand mit der zugrunde liegenden Bitmap wirklich verknüpft.
Deine Fragen.
1.Canvas hat eine eigene Bitmap. Die Oberfläche hat eine eigene Leinwand.
Ja, eine Leinwand arbeitet auf einer Bitmap (oder einem offenen GL -Feld). Die Oberfläche bietet Ihnen eine Leinwand, die auf der Oberfläche arbeitet, die für den Bitmap -Pixel -Store verwendet wird.
2. Alle Ansichten des Fensters teilen sich dieselbe Oberfläche und teilen Sie somit dieselbe Leinwand.
Nein, Sie könnten so viele Oberflächenansichten haben, wie Sie möchten.
3. Oberflächenview ist Unterklasse der Sicht, die im Gegensatz zu den Unterklassen der anderen Ansichten und der Ansicht selbst eine eigene Oberfläche zum Zeichnen hat.
Ja. Genau wie ListView ist eine Unterklasse der Ansicht, die eine eigene Listendatenstruktur hat. Jede Unterklasse der Sicht macht etwas anderes.