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.

  1. Canvas hat sein eigenes Bitmap angehängt an. Surface hat sein eigenes Canvas angehängt an.
  2. Alle ViewDas Fenster teilen dasselbe Surface und somit dasselbe teilen Canvas.
  3. SurfaceView ist Unterklasse von View, was im Gegensatz zu anderen ViewUnterklassen und View selbst hat seine eigene Surface Zeichnen.

Es gibt auch eine zusätzliche Frage:

  • Warum ist es Bedarf an a Surface Klasse, wenn es bereits ein gibt Canvas Für hochrangige Operationen mit Bitmap. Geben Sie ein Beispiel für eine Situation, in der Canvas ist nicht arbeitsfähig für die Arbeit, die Surface tun können.
War es hilfreich?

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

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

Hier ist ein sehr grundlegender und einfacher konzeptioneller Überblick darüber, wie Interaktion zwischen Fenster, Oberfläche, Leinwand und Bitmap geschieht.
Manchmal hilft eine visuelle Darstellung sehr beim Verständnis verdrehter Konzepte.
Ich hoffe, diese Grafik könnte jemandem helfen.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top