web-dev-qa-db-fra.com

Différence entre SurfaceView et View?

Quand est-il nécessaire ou préférable d'utiliser un SurfaceView au lieu d'un View?

203
Viktor

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.

206
Niko Gamulin

Quelques choses que j'ai notées:

  • SurfaceViews contient un mécanisme de rendu Nice permettant aux threads de mettre à jour le contenu de la surface sans utiliser de gestionnaire (bon pour l'animation).
  • Surfaceviews ne peut pas être transparent, ils ne peuvent apparaître que derrière d'autres éléments de la hiérarchie.
  • J'ai constaté qu'ils sont beaucoup plus rapides pour l'animation que pour le rendu dans une vue.

Pour plus d'informations (et un bon exemple d'utilisation), reportez-vous au projet LunarLander dans la section des exemples du SDK.

100
Ralphleon

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.

  • Le timing pour mettre à jour est différent. Le mécanisme de mise à jour de la vue normale est contraint ou contrôlé par la structure: vous appelez 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.
76
pierrotlefou

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.

44
jcoder

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

12
Setu Kumar Basak

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.

https://youtu.be/kRqsoApOr9

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

7