Estou lutando para entender o processo de desenho SurfaceView
e, portanto, todo o sistema Surface
/ Canvas
/ Bitmap
, que é usado no Android.
Eu li todos os artigos e páginas de documentação da API, que consegui encontrar no site de desenvolvedores do Android, alguns tutoriais de gráficos do Android, código-fonte do LunarLander e esta questão .
Diga-me quais dessas afirmações são verdadeiras, quais não são e por quê.
Canvas
tem seu próprioBitmap
anexo a ele.Surface
tem seu próprioCanvas
anexo a ele.- Todas
View
as janelas compartilham o mesmoSurface
e, portanto, compartilham o mesmoCanvas
. SurfaceView
é uma subclasse deView
, que, ao contrárioView
das subclasses de outras e deView
si mesma, tem seus próprios elementosSurface
para se inserir.
Há também uma pergunta adicional:
- Por que há necessidade de uma
Surface
classe, se já existe umCanvas
para operações de alto nível com bitmap. Dê um exemplo de uma situação em queCanvas
não seja adequado para fazer o trabalho queSurface
pode fazer.
android
android-canvas
surfaceview
Fiodoraniev
fonte
fonte
Respostas:
Aqui estão algumas definições:
Uma superfície é um objeto que contém pixels que estão sendo compostos na tela. Cada janela que você vê na tela (uma caixa de diálogo, sua atividade em tela inteira, a barra de status) tem sua própria superfície para a qual é desenhada e o Surface Flinger as renderiza para a exibição final em sua ordem Z correta. Uma superfície normalmente tem mais de um buffer (geralmente dois) para fazer a renderização em buffer duplo: o aplicativo pode desenhar seu próximo estado de IU enquanto o defletor de superfície está compondo a tela usando o último buffer, sem precisar esperar que o aplicativo termine desenhando.
Uma janela é basicamente como você pensa em uma janela na área de trabalho. Possui uma única superfície na qual o conteúdo da janela é renderizado. Um aplicativo interage com o Gerenciador de janelas para criar janelas; o Window Manager cria uma superfície para cada janela e a entrega ao aplicativo para desenho. O aplicativo pode desenhar o que quiser na Superfície; para o gerenciador de janelas é apenas um retângulo opaco.
Uma visualização é um elemento de interface do usuário interativo dentro de uma janela. Uma janela possui uma única hierarquia de visualização anexada a ela, que fornece todo o comportamento da janela. Sempre que a janela precisar ser redesenhada (por exemplo, porque uma visualização se invalidou), isso é feito na superfície da janela. A superfície está bloqueada, o que retorna uma tela que pode ser usada para desenhar nela. Uma passagem de desenho é feita na hierarquia, entregando o Canvas para cada visualização para desenhar sua parte da IU. Uma vez feito isso, o Surface é desbloqueado e postado de forma que o buffer recém-desenhado seja trocado para o primeiro plano para então ser composto na tela pelo Surface Flinger.
Um SurfaceView é uma implementação especial de View que também cria sua própria Surface dedicada para o aplicativo desenhar diretamente (fora da hierarquia de view normal, que de outra forma deve compartilhar a única Surface para a janela). A maneira como isso funciona é mais simples do que você pode esperar - tudo o que SurfaceView faz é pedir ao gerenciador de janelas para criar uma nova janela, dizendo-lhe para ordenar a janela imediatamente atrás ou na frente da janela do SurfaceView, e posicionando-a para corresponder onde o SurfaceView aparece na janela que o contém. Se a superfície está sendo colocada atrás da janela principal (na ordem Z), SurfaceView também preenche sua parte da janela principal com transparência para que a superfície possa ser vista.
Um bitmap é apenas uma interface para alguns dados de pixel. Os pixels podem ser alocados pelo próprio Bitmap quando você está criando um diretamente, ou pode estar apontando para pixels que não possui, como o que acontece internamente para conectar um Canvas a uma Surface para desenhar. (Um bitmap é criado e apontado para o buffer de desenho atual da superfície.)
Além disso, lembre-se de que, como isso implica, um SurfaceView é um objeto muito pesado. Se você tiver vários SurfaceViews em uma IU específica, pare e pense se isso é realmente necessário. Se você tiver mais de dois, quase certamente terá muitos.
fonte
#hackbod's
responder,SurfaceView
também pode ser renderizado a partir de thread secundário, o que não é possível paraView
objetosAqui está uma visão geral conceitual muito básica e simples de como a interação acontece entre a janela, superfície, tela e bitmap.
Às vezes, uma representação visual ajuda muito na compreensão de conceitos distorcidos.
Espero que este gráfico possa ajudar alguém.
fonte
Um bitmap é simplesmente um invólucro para uma coleção de pixels. Pense nisso como uma matriz de pixels com algumas outras funções convenientes.
O Canvas é simplesmente a classe que contém todos os métodos de desenho. É semelhante à classe Graphics em AWT / Swing se você estiver familiarizado com ela. Toda a lógica de como desenhar um círculo, ou uma caixa, etc. está contida no Canvas. Uma tela desenha em um bitmap ou um contêiner GL aberto, mas não há razão para que no futuro ela possa ser estendida para desenhar em outros tipos de rasters.
SurfaceView é uma vista que contém uma superfície. Uma superfície é semelhante a um bitmap (tem um armazenamento de pixels). Não sei como é implementado, mas imagino que seja algum tipo de invólucro de bitmap com métodos extras para coisas que estão diretamente relacionadas a exibições de tela (essa é a razão para uma superfície, um bitmap é muito genérico). Você pode obter uma tela de sua superfície que está realmente obtendo a tela associada ao bitmap subjacente.
Suas perguntas.
Sim, uma tela opera em um bitmap (ou um painel GL aberto). O Surface fornece um Canvas que opera em qualquer superfície que esteja usando para seu armazenamento de pixels de estilo Bitmap.
Não. Você pode ter quantas visualizações de superfície quiser.
Sim. Assim como ListView é uma subclasse de View que possui sua própria estrutura de dados List. Cada subclasse de View faz algo diferente.
fonte
Bitmap
eSurface
são apenas espécies diferentes de armazenamento de pixels eCanvas
podem envolver qualquer um deles?