Question

J'ai du mal à comprendre le processus d'élaboration de SurfaceView et donc l'ensemble Surface / Canvas / système Bitmap, qui est utilisé dans Android.

J'ai lu tous les articles et pages de documentation de l'API, que j'ai pu trouver sur place android-développeurs, quelques tutoriels de graphiques android, code source et LunarLander cette question.

S'il vous plaît dites-moi, lequel de ces affirmations sont vraies, qui ne sont pas, et pourquoi.

  1. Canvas a son propre Bitmap attaché. Surface a son propre Canvas attaché.
  2. Toutes les View est de la part de la même fenêtre Surface et ainsi partager la même Canvas.
  3. SurfaceView est sous-classe de View, qui, contrairement à d'autres sous-classes de View et View lui-même, a sa propre Surface à attirer.

Il y a aussi une question supplémentaire:

  • Pourquoi est-il besoin d'une classe Surface, s'il existe déjà un Canvas pour les opérations de haut niveau avec bitmap. Donner un exemple d'une situation où Canvas est non approprié pour faire le travail qui Surface peut le faire.
Était-ce utile?

La solution

Voici quelques définitions:

  • Une surface est un objet contenant des pixels qui sont à l'écran en composition. Chaque fenêtre que vous voyez à l'écran (une boîte de dialogue, votre activité en plein écran, la barre d'état) a sa propre surface qu'elle attire, et la surface Flinger rend ceux-ci à l'affichage final dans leur Z-ordre. Une surface a généralement plus d'un tampon (généralement deux) pour effectuer le rendu double tampon: l'application peut être Puisant son prochain état de l'interface utilisateur alors que la flinger de surface est compositing l'écran à l'aide du dernier tampon, sans avoir besoin d'attendre l'application à la fin dessin.

  • fenêtre A est essentiellement comme vous pensez d'une fenêtre sur le bureau. Il a une seule surface dans laquelle le contenu de la fenêtre est rendu. Une application interagit avec le gestionnaire de fenêtres pour créer des fenêtres; le gestionnaire de fenêtres crée une surface pour chaque fenêtre et donne à la demande de dessin. L'application peut tirer ce qu'elle veut dans la surface; au gestionnaire de fenêtres, il est juste un rectangle opaque.

  • Une vue est une partie intérieure de l'élément d'interface utilisateur interactive d'une fenêtre. Une fenêtre a une vue hiérarchie unique attaché à lui, qui fournit la totalité du comportement de la fenêtre. Chaque fois que la fenêtre doit être redessinée (comme parce qu'une vue elle-même a invalidé), cela se fait dans la surface de la fenêtre. La surface est verrouillé, qui renvoie une toile qui peut être utilisé pour dessiner dedans. Un parcours d'étirage se fait en bas de la hiérarchie, distribuant le canevas vers le bas pour chaque vue de tirer sa partie de l'interface utilisateur. Une fois fait, la surface est déverrouillé et affiché de telle sorte que le tampon est dessiné juste permuté au premier plan pour ensuite être mixée à l'écran par surface Flinger.

  • A SurfaceView est une implémentation spéciale de vue qui crée également sa propre surface dédiée à l'application de tirer directement dans (en dehors de la hiérarchie de la vue normale, qui doit par ailleurs partager la seule surface de la fenêtre). La façon dont cela fonctionne est plus simple que vous pouvez vous attendre - tout SurfaceView fait est de demander au gestionnaire de fenêtres pour créer une nouvelle fenêtre, en disant à Z pour que la fenêtre soit immédiatement derrière ou devant la fenêtre du SurfaceView, et le positionnement à correspondance où le SurfaceView apparaît dans la fenêtre contenant. Si la surface est placée derrière la fenêtre principale (dans l'ordre Z), SurfaceView remplit également sa part de la fenêtre principale avec la transparence afin que la surface peut être vu.

  • Bitmap est juste une interface à certaines données de pixels. Les pixels peuvent être attribués par Bitmap lui-même lorsque vous créez directement un, ou il peut pointer aux pixels, il ne fait pas propre, comme ce qui se passe à l'intérieur pour accrocher une toile jusqu'à une surface pour le dessin. (A Bitmap est créé et signalé dans le tampon de tirage de courant de la surface).

Aussi s'il vous plaît garder à l'esprit que, comme cela implique, un SurfaceView est un joli objet lourd poids. Si vous avez plusieurs SurfaceViews dans une interface utilisateur particulier, arrêter et penser à si cela est vraiment nécessaire. Si vous avez plus de deux, vous avez certainement trop.

Autres conseils

Voici un aperçu conceptuel très basique et simple de la façon dont l'interaction se produit entre la fenêtre, surface, toile et Bitmap.
Parfois, une représentation visuelle aide beaucoup à comprendre les concepts tordus.
J'espère que ce graphique pourrait aider quelqu'un.

A Bitmap est simplement une enveloppe pour un ensemble de pixels. Pensez-y comme un tableau de pixels avec d'autres fonctions pratiques.

La toile est tout simplement la classe qui contient toutes les méthodes de dessin. Il est similaire à la classe Graphics dans AWT / Swing si vous êtes au courant. Toute la logique sur la façon de dessiner un cercle, ou une boîte, etc. est contenu à l'intérieur de la toile. Une toile tire sur un Bitmap ou un conteneur GL ouvert, mais il n'y a aucune raison pour que dans l'avenir, il pourrait être étendu à tirer sur d'autres types de rasters.

SurfaceView est une vue qui contient une surface. Une surface est similaire à une image bitmap (il a une mémoire de pixel). Je ne sais pas comment il est mis en œuvre, mais j'imagine que c'est un certain type d'emballage Bitmap avec des méthodes supplémentaires pour des choses qui sont directement liés à des écrans d'écran (C'est la raison d'une surface, une Bitmap est trop générique). Vous pouvez obtenir une toile de votre surface qui est vraiment obtenir le canevas associé à la Bitmap sous-jacent.

Vos questions.

  

1.Canvas a son propre Bitmap attaché. Surface a sa propre toile attaché.

Oui, une toile fonctionne sur une Bitmap (ou un panneau de GL ouvert). Surface vous donne une toile qui fonctionne sur toute surface utilise pour son magasin de pixel de style Bitmap.

  

Voir 2.Tous de la part de la fenêtre de la même surface et ainsi partager la même toile.

Non

. Vous pouvez avoir autant de points de vue de la surface que vous voulez.

  

3.SurfaceView est sous-classe de View, qui, contrairement à d'autres sous-classes de Vue et Vue elle-même, a sa propre surface pour dessiner.

Oui. Tout comme ListView est une sous-classe de vue qui a sa propre structure de données de liste. Chaque sous-classe de vue ne quelque chose de différent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top