Comprender los conceptos de Lona y Superficie

Estoy luchando por comprender el proceso de dibujo a SurfaceView y, por lo tanto, a todo el sistema Surface / Canvas / Bitmap , que se usa en Android.

He leído todos los artículos y páginas de documentación de API, que pude encontrar en el sitio de desarrolladores de Android, algunos tutoriales de gráficos de Android, el código fuente de LunarLander y esta pregunta .

Por favor dígame cuáles de estas afirmaciones son verdaderas, cuáles no, y por qué.

  1. Canvas tiene su propio Bitmap adjunto. Surface tiene su propio Canvas adjunto.
  2. Todas las View de la ventana comparten la misma Surface y comparten el mismo Canvas .
  3. SurfaceView es la subclase de View , que, a diferencia de las otras subclases de View y View , tiene su propia Surface para dibujar.

También hay una pregunta adicional:

  • ¿Por qué hay una necesidad de una clase de Surface si ya hay un Canvas para operaciones de alto nivel con bitmap? Dé un ejemplo de una situación en la que Canvas no es adecuado para hacer el trabajo que Surface puede hacer.

Aquí hay algunas definiciones:

  • Una superficie es un objeto que contiene los píxeles que se están componiendo en la pantalla. Cada ventana que ve en la pantalla (un cuadro de diálogo, su actividad de pantalla completa, la barra de estado) tiene su propia superficie en la que se dibuja, y Surface Flinger las muestra en la pantalla final en su orden Z correcto. Normalmente, una superficie tiene más de un búfer (normalmente dos) para realizar una representación con búfer doble: la aplicación puede dibujar su siguiente estado de UI mientras el mezclador de superficie está componiendo la pantalla utilizando el último búfer, sin necesidad de esperar a que la aplicación termine dibujo.

  • Una ventana es básicamente como pensar en una ventana en el escritorio. Tiene una única superficie en la que se representa el contenido de la ventana. Una aplicación interactúa con el Administrador de ventanas para crear ventanas; el Administrador de ventanas crea una Superficie para cada ventana y se la da a la aplicación para dibujar. La aplicación puede dibujar lo que quiera en la superficie; para Window Manager es solo un rectángulo opaco.

  • Una vista es un elemento de interfaz de usuario interactivo dentro de una ventana. Una ventana tiene una jerarquía de vista única adjunta, que proporciona todo el comportamiento de la ventana. Cuando sea necesario volver a dibujar la ventana (por ejemplo, porque una vista se ha invalidado), se hace en la superficie de la ventana. La superficie está bloqueada, lo que devuelve un canvas que se puede utilizar para dibujar en él. Se realiza un recorrido de dibujo por la jerarquía y se baja el canvas para que cada vista dibuje su parte de la IU. Una vez hecho esto, la Superficie se desbloquea y se publica para que el búfer recién dibujado se intercambie al primer plano para luego ser compuesto a la pantalla por Surface Flinger.

  • Un SurfaceView es una implementación especial de View que también crea su propia superficie dedicada para que la aplicación la dibuje directamente (fuera de la jerarquía de vista normal, que de lo contrario debe compartir la superficie única para la ventana). La forma en que esto funciona es más simple de lo que puede esperar: todo lo que SurfaceView hace es pedirle al administrador de ventanas que cree una nueva ventana, diciéndole que ordene esa ventana, ya sea inmediatamente detrás o enfrente de la ventana de SurfaceView, y posicionándola para que coincida donde SurfaceView aparece en la ventana que lo contiene. Si la superficie se coloca detrás de la ventana principal (en orden Z), SurfaceView también rellena su parte de la ventana principal con transparencia para que se pueda ver la superficie.

  • Un bitmap es solo una interfaz para algunos datos de píxeles. Los píxeles pueden ser asignados por Bitmap en sí cuando está creando directamente uno, o puede estar apuntando a píxeles que no posee, como por ejemplo lo que ocurre internamente para enganchar un Canvas a una Surface para dibujar. (Se crea un bitmap y apunta al búfer de dibujo actual de la superficie).

También tenga en cuenta que, como esto implica, un SurfaceView es un objeto bastante pesado. Si tiene SurfaceViews múltiples en una IU particular, deténgase y piense si esto realmente es necesario. Si tiene más de dos, seguramente tendrá demasiados.

Una visión general conceptual de Ventana, Superficie, Lienzo y Mapa de bits

Aquí hay una descripción conceptual muy simple y básica de cómo ocurre la interacción entre la ventana, superficie, canvas y bitmap.
A veces, una representación visual ayuda mucho a comprender conceptos retorcidos.
Espero que este gráfico pueda ayudar a alguien.

Un bitmap es simplemente un contenedor para una colección de píxeles. Piense en ello como una matriz de píxeles con algunas otras funciones convenientes.

El canvas es simplemente la clase que contiene todos los métodos de dibujo. Es similar a la clase Graphics en AWT / Swing si está familiarizado con eso. Toda la lógica sobre cómo dibujar un círculo, una caja, etc. está contenida dentro de Canvas. Un canvas dibuja en un bitmap o en un contenedor GL abierto, pero no hay ninguna razón por la que en el futuro pueda extenderse para dibujar en otros tipos de rásteres.

SurfaceView es una vista que contiene una superficie. Una superficie es similar a un bitmap (tiene una tienda de píxeles). No sé cómo se implementa, pero me imagino que es una especie de envoltorio de bitmap con métodos adicionales para cosas que están directamente relacionadas con las pantallas (esa es la razón de una superficie, un bitmap es demasiado genérico). Puedes obtener un Lienzo de tu Superficie que realmente consiga el Lienzo asociado con el Mapa de Bits subyacente.

Tus preguntas.

1.Canvas tiene su propio bitmap adjunto. La superficie tiene su propio Lienzo adjunto.

Sí, un canvas funciona en un bitmap (o un panel GL abierto). Surface le proporciona un canvas que está funcionando en cualquier superficie que esté utilizando para su tienda de píxeles de estilo Bitmap.

2. Todas las vistas de la ventana comparten la misma superficie y comparten el mismo canvas.

No. Podría tener tantas vistas de superficie como desee.

3.SurfaceView es una subclase de View que, a diferencia de las otras subclases de View y View, tiene su propia Surface para dibujar.

Sí. Al igual que ListView es una subclase de vista que tiene su propia estructura de datos de lista. Cada subclase de Vista hace algo diferente.