Quand est-il nécessaire ou préférable d'utiliser un SurfaceView
au lieu d'un View
?
Les vues sont toutes dessinées sur le même thread d'interface graphique, qui est également utilisé pour toutes les interactions de l'utilisateur.
Donc, si vous devez mettre à jour l'interface graphique rapidement ou si le rendu prend trop de temps et affecte l'expérience utilisateur, utilisez SurfaceView
.
Quelques choses que j'ai notées:
Pour plus d'informations (et un bon exemple d'utilisation), reportez-vous au projet LunarLander dans la section des exemples du SDK.
mis à jour le 05/09/2014
D'ACCORD. Nous avons document officiel maintenant. Il a parlé de tout ce que j'ai mentionné, d'une meilleure façon.
Lire plus en détail ici .
Oui, la principale différence est que surfaceView peut être mis à jour sur le fil d’arrière-plan. Cependant, il y a plus que vous pourriez vous soucier.
surfaceView a un tampon de surface dédié alors que toute la vue partage un tampon de surface alloué par ViewRoot. Dans un autre mot, surfaceView coûte plus de ressources.
surfaceView ne peut pas être accéléré matériellement (à partir de JB4.2) alors que 95% des opérations sur View normal sont accélérées à l'aide de OpenGL ES.
Plus de travail devrait être fait pour créer votre surfaceView personnalisé. Vous devez écouter l'événement surfaceCreated/Destroy, créer un thread de rendu et, plus important encore, synchroniser le thread de rendu et le thread principal. Cependant, pour personnaliser la vue, il vous suffit de remplacer la méthode onDraw
.
view.invalidate
dans le fil de l'interface utilisateur ou view.postInvalid
dans un autre fil pour indiquer au framework que la vue doit être mise à jour. Cependant, la vue ne sera pas mise à jour immédiatement, mais attendez le prochain événement VSYNC est arrivé. L'approche facile à comprendre VSYNC consiste à le considérer comme un minuteur qui s’allume toutes les 16 ms pour un écran de 60 images par seconde. Dans Android, toute la mise à jour de la vue normale (et l’affichage en fait, mais je ne le parlerai pas aujourd’hui), est synchronisée avec VSYNC pour obtenir une meilleure fluidité. Maintenant, revenons à la surfaceView, vous pouvez la restituer à tout moment, mais je ne saurais dire si c'est un avantage, car l'affichage est également synchronisé avec VSYNC, comme indiqué précédemment.La principale différence est que SurfaceView
peut être utilisé par des theads d’arrière-plan mais que Views
ne le peut pas. SurfaceViews
utilise plus de ressources, vous ne voudrez donc pas les utiliser sauf obligation.
Un SurfaceView
est une vue personnalisée dans Android) qui peut être utilisée pour y être dessinée.
La principale différence entre View
et SurfaceView
est qu'une vue est dessinée dans le UI Thread
, Qui est utilisé pour toutes les interactions de l'utilisateur.
Si vous souhaitez mettre à jour l'interface utilisateur assez rapidement et y restituer une bonne quantité d'informations, une SurfaceView est un meilleur choix.
Mais il y a quelques aspects techniques au SurfaceView
:
1. Ils ne sont pas accélérés matériellement.
2. Les vues normales sont rendues lorsque vous appelez les méthodes invalidate
ou postInvalidate()
, mais cela ne signifie pas que la vue sera immédiatement mise à jour ( Un VSYNC
sera envoyé et le système d'exploitation décidera quand il sera mis à jour. Le SurfaceView
pourra être immédiatement mis à jour.
. Un SurfaceView a un surface buffer
Alloué, il est donc plus coûteux
L'une des principales différences entre surfaceview et view est que, pour actualiser l'écran pour une vue normale, nous devons appeler la méthode invalidate à partir du même thread que celui où la vue est définie. Mais même si nous appelons invalidate, le rafraîchissement ne se produit pas immédiatement. Il ne se produit qu'après la prochaine arrivée du signal VSYNC. VSYNC le signal est un signal généré par le noyau qui se produit toutes les 16,6 ms ou que nous appelons également trame de 60 Donc, si nous voulons plus de contrôle sur l'actualisation de l'écran (par exemple, pour une animation très rapide), nous ne devrions pas utiliser la classe de vue normale.
Par contre, en cas de surfaceview, nous pouvons rafraîchir l’écran aussi vite que nous le voulons et nous pouvons le faire à partir d’un fil d’arrière-plan. Le rafraîchissement de la surface ne dépend donc vraiment pas de VSYNC, ce qui est très utile si vous souhaitez réaliser une animation à grande vitesse. J'ai quelques vidéos de formation et des exemples d'applications qui expliquent toutes ces choses bien. Veuillez regarder les vidéos de formation suivantes.