125 Stimmen

Verstehen von Canvas- und Oberflächenkonzepten

Es fällt mir schwer, den Prozess des Zeichnens zu verstehen SurfaceView und damit die gesamte Surface / Canvas / Bitmap System, das in Android verwendet wird.

Ich habe alle Artikel und API-Dokumentationsseiten gelesen, die ich auf der Android-Entwicklerseite finden konnte, ein paar Tutorials zu Android-Grafiken, den LunarLander-Quellcode und 本問 .

Bitte sagen Sie mir, welche dieser Aussagen wahr sind und welche nicht, und warum.

  1. Canvas hat seine eigene Bitmap damit verbunden. Surface hat seine eigene Canvas damit verbunden.
  2. Alle View des Fensters teilen sich denselben Surface und teilen somit dieselbe Canvas .
  3. SurfaceView ist Unterklasse von View die im Gegensatz zu anderen View Unterklassen und View selbst, hat seine eigene Surface anziehen.

Es gibt noch eine zusätzliche Frage:

  • Warum ist ein Bedarf für eine Surface Klasse, wenn es bereits eine Canvas für High-Level-Operationen mit Bitmap. Nennen Sie ein Beispiel für eine Situation, in der Canvas nicht geeignet ist für Arbeiten, die Surface tun können.

244voto

hackbod Punkte 89543

Hier sind einige Definitionen:

  • Eine Fläche ist ein Objekt mit Pixeln, die auf dem Bildschirm zusammengesetzt werden. Jedes Fenster, das Sie auf dem Bildschirm sehen (ein Dialog, Ihre Vollbildaktivität, die Statusleiste), hat seine eigene Oberfläche, in die es zeichnet, und Surface Flinger rendert diese auf der endgültigen Anzeige in ihrer korrekten Z-Reihenfolge. Eine Oberfläche hat typischerweise mehr als einen Puffer (normalerweise zwei), um ein doppelt gepuffertes Rendering zu ermöglichen: Die Anwendung kann ihren nächsten UI-Status zeichnen, während der Surface Flinger den Bildschirm unter Verwendung des letzten Puffers zusammensetzt, ohne darauf warten zu müssen, dass die Anwendung das Zeichnen beendet.

  • Ein Fenster ist im Grunde das, was man sich unter einem Fenster auf dem Desktop vorstellt. Es hat eine einzige Oberfläche, in der der Inhalt des Fensters gerendert wird. Eine Anwendung interagiert mit dem Fenstermanager, um Fenster zu erstellen; der Fenstermanager erstellt eine Oberfläche für jedes Fenster und gibt sie der Anwendung zum Zeichnen. Die Anwendung kann auf der Oberfläche zeichnen, was immer sie will; für den Window Manager ist sie nur ein undurchsichtiges Rechteck.

  • Eine Ansicht ist ein interaktives UI-Element innerhalb eines Fensters. Einem Fenster ist eine einzelne View-Hierarchie zugeordnet, die das gesamte Verhalten des Fensters bestimmt. Wann immer das Fenster neu gezeichnet werden muss (z.B. weil eine View sich selbst ungültig gemacht hat), wird dies in der Oberfläche des Fensters durchgeführt. Die Oberfläche wird gesperrt, was ein Canvas zurückgibt, das zum Zeichnen verwendet werden kann. Ein Zeichentraversal wird in der Hierarchie nach unten durchgeführt, wobei der Canvas für jede Ansicht weitergereicht wird, um ihren Teil der Benutzeroberfläche zu zeichnen. Sobald dies geschehen ist, wird die Oberfläche entsperrt und gepostet, so dass der soeben gezeichnete Puffer in den Vordergrund geschoben wird, um dann von Surface Flinger auf dem Bildschirm zusammengesetzt zu werden.

  • Eine SurfaceView ist eine spezielle Implementierung von View, die auch eine eigene Oberfläche für die Anwendung erstellt, in die direkt gezeichnet werden kann (außerhalb der normalen View-Hierarchie, die sich ansonsten die einzige Oberfläche für das Fenster teilen muss). Die Art und Weise, wie dies funktioniert, ist einfacher als Sie vielleicht erwarten -- alles, was SurfaceView tut, ist, den Fenstermanager aufzufordern, ein neues Fenster zu erstellen, ihm zu sagen, dieses Fenster entweder direkt hinter oder vor dem Fenster der SurfaceView in Z zu ordnen und es so zu positionieren, dass es mit der Stelle übereinstimmt, an der die SurfaceView im enthaltenen Fenster erscheint. Wenn die Oberfläche hinter dem Hauptfenster (in Z-Reihenfolge) platziert wird, füllt SurfaceView auch seinen Teil des Hauptfensters mit Transparenz, so dass die Oberfläche zu sehen ist.

  • Ein Bitmap ist lediglich eine Schnittstelle zu Pixeldaten. Die Pixel können von Bitmap selbst zugewiesen werden, wenn Sie direkt eine erstellen, oder es kann auf Pixel zeigen, die es nicht besitzt, wie das, was intern geschieht, um ein Canvas an eine Oberfläche zum Zeichnen anzuschließen. (Eine Bitmap wird erstellt und zeigt auf den aktuellen Zeichenpuffer der Oberfläche).

Bitte bedenken Sie auch, dass eine SurfaceView ein ziemlich schweres Objekt ist. Wenn Sie mehrere SurfaceViews in einer bestimmten Benutzeroberfläche haben, sollten Sie innehalten und darüber nachdenken, ob dies wirklich notwendig ist. Wenn Sie mehr als zwei haben, haben Sie mit Sicherheit zu viele.

58voto

Sabeeh Punkte 1023

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

Hier ist ein sehr grundlegender und einfacher konzeptioneller Überblick darüber, wie die Interaktion zwischen dem Fenster, der Oberfläche, der Leinwand und der Bitmap erfolgt.
Manchmal ist eine visuelle Darstellung sehr hilfreich, um verdrehte Konzepte zu verstehen.
Ich hoffe, diese Grafik kann jemandem helfen.

21voto

sksamuel Punkte 15552

Ein Bitmap ist einfach ein Wrapper für eine Sammlung von Pixeln. Betrachten Sie es als ein Array von Pixeln mit einigen anderen praktischen Funktionen.

Der Canvas ist einfach die Klasse, die alle Zeichenmethoden enthält. Sie ähnelt der Klasse Graphics in AWT/Swing, falls Sie mit dieser vertraut sind. Die gesamte Logik zum Zeichnen eines Kreises, einer Box usw. ist in Canvas enthalten. Ein Canvas zeichnet auf eine Bitmap oder einen offenen GL-Container, aber es gibt keinen Grund, warum es 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 ist ähnlich wie eine Bitmap (sie hat einen Pixelspeicher). Ich weiß nicht, wie es implementiert ist, aber ich könnte mir vorstellen, dass es eine Art Bitmap-Wrapper mit zusätzlichen Methoden für Dinge ist, die direkt mit Bildschirmanzeigen verbunden sind (Das ist der Grund für eine Oberfläche, eine Bitmap ist zu allgemein). Sie können ein Canvas von Ihrer Oberfläche, die wirklich immer die Leinwand mit der zugrunde liegenden Bitmap zugeordnet ist erhalten.

Ihre Fragen.

1.canvas hat eine eigene Bitmap, die mit ihm verbunden ist. Die Oberfläche hat eine eigene Leinwand, die mit ihr verbunden ist.

Ja, eine Leinwand arbeitet mit einer Bitmap (oder einem offenen GL-Panel). Oberfläche gibt Ihnen eine Leinwand, die auf was auch immer Oberfläche für seine Bitmap-Stil Pixelspeicher verwendet wird, arbeitet.

2. alle Ansichten eines Fensters teilen sich dieselbe Oberfläche und somit auch dieselbe Leinwand.

Nein. Sie können so viele Oberflächenansichten haben, wie Sie wollen.

SurfaceView ist eine Unterklasse von View, die im Gegensatz zu anderen Unterklassen von View und View selbst eine eigene Oberfläche zum Zeichnen hat.

Ja. Genauso wie ListView eine Unterklasse von View ist, die ihre eigene List-Datenstruktur hat. Jede Unterklasse von View tut etwas anderes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X