Estoy luchando para entender el proceso de elaboración de SurfaceView
y por lo tanto el conjunto Surface
/ Canvas
/ Bitmap
sistema, que se utiliza en Android.
He leído todos los artículos y las páginas de documentación de la 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é.
Canvas
tiene el suyo propioBitmap
.Surface
tiene el suyo propioCanvas
.- Todas
View
las ventanas comparten lo mismoSurface
y, por lo tanto, comparten lo mismoCanvas
. SurfaceView
es una subclase deView
, que, a diferencia de otrasView
subclases y deView
sí misma, tiene la suya propiaSurface
.
También hay una pregunta adicional:
- ¿Por qué se necesita una
Surface
clase, si ya existe unaCanvas
para operaciones de alto nivel con mapa de bits? Dé un ejemplo de una situación en laCanvas
que no sea adecuado para hacer un trabajo queSurface
pueda hacer.
android
android-canvas
surfaceview
fyodorananiev
fuente
fuente
Respuestas:
Aquí hay algunas definiciones:
Una superficie es un objeto que contiene píxeles que se componen 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 en la que se dibuja, y Surface Flinger las muestra en la pantalla final en su orden Z correcto. Por lo general, una superficie tiene más de un búfer (generalmente dos) para realizar un renderizado con doble búfer: la aplicación puede dibujar su siguiente estado de interfaz de usuario mientras el indicador de superficie está componiendo la pantalla utilizando el último búfer, sin necesidad de esperar a que finalice la aplicación. dibujo.
Una ventana es básicamente como piensas en una ventana en el escritorio. Tiene una única superficie en la que se renderiza 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 la entrega a la aplicación para dibujar. La aplicación puede dibujar lo que quiera en Surface; para el Administrador de ventanas 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. Siempre que sea necesario volver a dibujar la ventana (por ejemplo, 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 usar para dibujar en él. Se realiza un recorrido de dibujo hacia abajo en la jerarquía, pasando el lienzo hacia abajo para cada vista para dibujar su parte de la interfaz de usuario. Una vez hecho esto, Surface se desbloquea y se publica para que el búfer recién dibujado se cambie al primer plano para luego ser compuesto en la pantalla por Surface Flinger.
Un SurfaceView es una implementación especial de View que también crea su propia Surface dedicada para que la aplicación dibuje directamente (fuera de la jerarquía de vista normal, que de lo contrario debe compartir la superficie única de la ventana). La forma en que esto funciona es más simple de lo que podría esperar: todo lo que SurfaceView hace es pedirle al administrador de ventanas que cree una nueva ventana, indicándole que ordene en Z esa ventana inmediatamente detrás o delante de la ventana de SurfaceView, y colocándola para que coincida donde aparece SurfaceView en la ventana contenedora. Si la superficie se coloca 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 solo una interfaz para algunos datos de píxeles. Los píxeles pueden ser asignados por Bitmap cuando está creando uno directamente, o puede estar apuntando a píxeles que no son de su propiedad, como lo que sucede internamente para conectar un lienzo a una superficie para dibujar. (Se crea un mapa de bits y se 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 varias SurfaceViews en una interfaz de usuario en particular, deténgase y piense si esto es realmente necesario. Si tiene más de dos, es casi seguro que tenga demasiados.
fuente
#hackbod's
responder,SurfaceView
también se puede renderizar desde un hilo secundario que no es posible para losView
objetosA continuación, se ofrece una descripción general conceptual muy básica y sencilla de cómo se produce la interacción entre la ventana, la superficie, el lienzo y el mapa de bits.
A veces, una representación visual ayuda mucho a comprender conceptos retorcidos.
Espero que este gráfico pueda ayudar a alguien.
fuente
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.
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, o un cuadro, etc. está contenida dentro de Canvas. Un lienzo se basa en un mapa de bits o un contenedor GL abierto, pero no hay ninguna razón por la que en el futuro se pueda ampliar para dibujar en otros tipos de rásteres.
SurfaceView es una vista que contiene una superficie. Una superficie es similar a un mapa de bits (tiene un almacén de píxeles). No sé cómo se implementa, pero me imagino que es una especie de envoltorio de mapa de bits con métodos adicionales para cosas que están directamente relacionadas con la visualización de la pantalla (esa es la razón de una superficie, un mapa de bits es demasiado genérico). Puede obtener un lienzo de su superficie que realmente está asociando el lienzo con el mapa de bits subyacente.
Tus preguntas.
Sí, un lienzo funciona en un mapa de bits (o un panel GL abierto). Surface te ofrece un Canvas que funciona en cualquier Surface que esté usando para su almacén de píxeles de estilo Bitmap.
No. Puede tener tantas vistas de superficie como desee.
Si. Al igual que ListView es una subclase de View que tiene su propia estructura de datos List. Cada subclase de View hace algo diferente.
fuente
Bitmap
ySurface
son sólo diferentes especies de tienda de píxeles yCanvas
puede envolver cualquiera de ellos?