Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Comprensión de los conceptos de lienzo y superficie

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

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

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

  1. Canvas tiene su propio Bitmap adjunto a ella. Surface tiene su propia Canvas unida a ella.
  2. Todas las View de la ventana comparten la misma Surface y comparten la misma Canvas .
  3. SurfaceView es una subclase de View que, a diferencia de 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 Surface , si ya existe un Canvas para operaciones de alto nivel con bitmap. Dé un ejemplo de una situación en la que Canvas no es adecuada para realizar trabajos que Surface puede hacer.

  • Cómo adjuntar MediaPlayer con SurfaceView en android?
  • Efecto de zoom en Android SurfaceView
  • Android: Crash: Línea de archivo XML binario: Error al inflar la clase (usando SurfaceView)
  • Tomar una foto lo más rápido posible con la API de la cámara en Android
  • No se puede mostrar 2 instancias de mi SurfaceView personalizado
  • Android Take Captura de pantalla de Vista de superficie muestra negro
  • Uso de surfaceView para capturar un video
  • SurfaceView y ANownWindow
  • 3 Solutions collect form web for “Comprensión de los conceptos de lienzo y superficie”

    Estas son algunas definiciones:

    • Una Superficie es un objeto que contiene píxeles que se están componiendo en la pantalla. Cada ventana que ves en la pantalla (un cuadro de diálogo, tu actividad de pantalla completa, la barra de estado) tiene su propia superficie a la que se dirige y Surface Flinger hace que éstos aparezcan en la pantalla final en su orden Z correcto. Normalmente, una superficie tiene más de un búfer (normalmente dos) para hacer un renderizado de doble búfer: la aplicación puede dibujar su siguiente estado UI mientras que el desvío de superficie está componiendo la pantalla usando el último búfer, sin tener que esperar a que la aplicación termine dibujo.

    • Una ventana es básicamente como usted piensa 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 gestor de ventanas crea una superficie para cada ventana y la da a la aplicación de dibujo. La aplicación puede dibujar lo que quiera en la superficie; Al Administrador de ventanas es sólo 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 a ella, que proporciona todo el comportamiento de la ventana. Siempre que la ventana necesita ser redibujada (como porque una vista se ha invalidado), esto se hace en la superficie de la ventana. La superficie está bloqueada, lo que devuelve un lienzo que se puede utilizar para dibujar en él. Un trazado de trazado se hace en la jerarquía, dejando la lona hacia abajo para cada vista para dibujar su parte de la interfaz de usuario. Una vez hecho esto, la superficie se desbloquea y se coloca de modo que el búfer dibujado justo se cambie al primer plano para entonces ser compuesto a la pantalla por el Flinger de la superficie.

    • Un SurfaceView es una implementación especial de View que también crea su propia superficie dedicada para que la aplicación realice 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 se puede esperar – todo lo que SurfaceView hace es pedirle al gestor de ventanas que cree una nueva ventana, diciéndole a Z-ordenar esa ventana inmediatamente detrás o delante de la ventana de SurfaceView y colocarla para que coincida Donde el SurfaceView aparece en la ventana que contiene. Si la superficie está siendo colocada detrás de la ventana principal (en orden Z), SurfaceView también llena su parte de la ventana principal con transparencia para que se pueda ver la superficie.

    • Un mapa de bits es sólo una interfaz para algunos datos de píxeles. Los píxeles pueden ser asignados por Bitmap mismo cuando está directamente creando uno, o puede estar apuntando a píxeles que no posee como lo que sucede internamente para enganchar un lienzo hasta una superficie para dibujar. (Se crea un mapa de bits y se señala al búfer de dibujo actual de la superficie.)

    También tenga en cuenta que, como esto implica, un SurfaceView es un objeto muy pesado. Si tiene varias SurfaceViews en una interfaz de usuario en particular, deténgase y piense si esto es realmente necesario. Si tienes más de dos, casi seguro que tienes demasiados.

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

    Aquí está una visión general muy básica y simple de cómo la interacción ocurre entre la ventana, la superficie, la lona, ​​y el mapa de bits.
    A veces, una representación visual ayuda mucho a entender conceptos retorcidos.
    Espero que este gráfico pueda ayudar a alguien.

    Un mapa de bits 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 lienzo 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, o una caja, etc está contenida dentro de la lona. Un lienzo se basa en un mapa de bits o un contenedor de GL abierto, pero no hay ninguna razón por la que en el futuro podría extenderse para dibujar otros tipos de rasters.

    SurfaceView es una vista que contiene una superficie. Una superficie es similar a un mapa de bits (tiene una tienda de píxeles). No sé cómo se implementa, pero me imagino que es un tipo de Bitmap envoltorio con métodos adicionales para las cosas que están directamente relacionados con pantallas (que es la razón de una superficie, un mapa de bits es demasiado genérico). Usted puede obtener un lienzo de su superficie que realmente está recibiendo el lienzo asociado con el mapa de bits subyacente.

    Tus preguntas.

    1.Canvas tiene su propio mapa de bits adjunto a él. La superficie tiene su propia lona unida a ella.

    Sí, un lienzo funciona con un mapa de bits (o un panel GL abierto). La superficie le da un lienzo que está funcionando en cualquier superficie está utilizando para su almacén del pixel del estilo del mapa de bits.

    2. Todas las vistas de la ventana comparten la misma superficie y por lo tanto comparten la misma lona.

    No. Podrías tener tantas vistas de superficie como quieras.

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

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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.