Respostas:
As visualizações são todas desenhadas no mesmo encadeamento da GUI, que também é usado para toda a interação do usuário.
Portanto, se você precisar atualizar a GUI rapidamente ou se a renderização demorar muito e afetar a experiência do usuário, use SurfaceView
.
Algumas coisas que notei:
Para obter mais informações (e um ótimo exemplo de uso), consulte o projeto LunarLander na seção de exemplos do SDK.
atualizado em 09/09/2014
ESTÁ BEM. Temos um documento oficial agora. Ele falou tudo o que mencionei, de uma maneira melhor.
Leia mais detalhadamente aqui .
Sim, a principal diferença é que o surfaceView pode ser atualizado no encadeamento em segundo plano. No entanto, há mais que você pode se importar.
O surfaceView dedica o buffer de superfície, enquanto toda a exibição compartilha um buffer de superfície que é alocado pelo ViewRoot. Em outra palavra, o surfaceView custa mais recursos.
O surfaceView não pode ser acelerado por hardware (a partir do JB4.2), enquanto 95% das operações no View normal são aceleradas por HW usando o openGL ES.
Mais trabalho deve ser feito para criar seu surfaceView personalizado. Você precisa ouvir o evento surfaceCreated / Destroy, criar um encadeamento de renderização, mais importante, sincronizar o encadeamento de renderização e o encadeamento principal. No entanto, para personalizar o modo de exibição, tudo que você precisa fazer é substituir o onDraw
método.
view.invalidate
no thread da interface do usuário ou view.postInvalid
em outro thread para indicar à estrutura que a exibição deve ser atualizada. No entanto, a visualização não será atualizada imediatamente, mas aguarde até o próximo evento VSYNC chegar. A abordagem fácil de entender o VSYNC é considerá-lo como um temporizador que dispara a cada 16ms para uma tela de 60fps. No Android, toda a atualização normal da exibição (e a exibição realmente, mas não falarei hoje) é sincronizada com o VSYNC para obter uma melhor suavidade. Agora, de volta ao surfaceView, você pode renderizá-lo a qualquer momento que desejar. No entanto, mal posso dizer se é uma vantagem, pois a tela também está sincronizada com o VSYNC, como afirmado anteriormente.A principal diferença é que eles SurfaceView
podem ser desenhados por segmentos de fundo, mas Views
não podem.
SurfaceViews
use mais recursos para não usá-los, a menos que seja necessário.
A SurfaceView
é uma visualização personalizada no Android que pode ser usada para desenhar dentro dela.
A principal diferença entre a View
e a SurfaceView
é que uma View é desenhada na
UI Thread
, que é usada para toda a interação do usuário.
Se você deseja atualizar a interface do usuário com rapidez suficiente e renderizar uma boa quantidade de informações, um SurfaceView é uma escolha melhor.
Mas existem alguns detalhes técnicos no SurfaceView
:
1. Eles não são acelerados por hardware.
2. Visualizações normais são renderizadas quando você chama os métodosinvalidate
ou postInvalidate()
, mas isso não significa que a visualização será atualizada imediatamente (A VSYNC
será enviada e o sistema operacional decidirá quando será atualizada. A atualização SurfaceView
poderá ser imediata.
3. Um SurfaceView possui um alocado surface buffer
, por isso é mais caro
Uma das principais diferenças entre a visualização de surf e a visualização é que, para atualizar a tela para uma visualização normal, precisamos chamar o método invalidate do mesmo encadeamento em que a visualização é definida. Mas mesmo se chamarmos invalidar, a atualização não ocorrerá imediatamente. Ocorre somente após a próxima chegada do sinal VSYNC. O sinal VSYNC é um sinal gerado pelo kernel que ocorre a cada 16,6 ms ou também é conhecido como 60 quadros por segundo. Portanto, se quisermos ter mais controle sobre a atualização da tela (por exemplo, para animações em movimento muito rápido), não devemos usar a classe de exibição normal.
Por outro lado, no caso da visualização de surf, podemos atualizar a tela o mais rápido que queremos e podemos fazê-lo a partir de um encadeamento em segundo plano. Portanto, a atualização da visualização da surf realmente não depende do VSYNC, e isso é muito útil se queremos fazer animações em alta velocidade. Eu tenho poucos vídeos de treinamento e aplicativos de exemplo que explicam bem todas essas coisas. Por favor, dê uma olhada nos seguintes vídeos de treinamento.
Por que usar o SurfaceView e não a classe clássica do View ...
Um dos principais motivos é que o SurfaceView pode renderizar a tela rapidamente.
Em palavras simples, um SV é mais capaz de gerenciar o tempo e renderizar animações.
Para entender melhor o que é um SurfaceView, devemos compará-lo com a classe View.
Qual é a diferença ... confira esta explicação simples no vídeo
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Bem, com o View, temos um grande problema ... o tempo de renderização das animações.
Normalmente, o onDraw () é chamado no sistema de tempo de execução do Android.
Portanto, quando o sistema de tempo de execução do Android chama onDraw (), o aplicativo não pode controlar
o tempo de exibição, e isso é importante para a animação. Temos uma lacuna de tempo
entre o aplicativo (nosso jogo) e o sistema de tempo de execução do Android.
O SV pode chamar o onDraw () por um Thread dedicado.
Assim: o aplicativo controla o tempo. Assim, podemos exibir a próxima imagem de bitmap da animação.