2010-07-16 7 views
29

J'ai passé quelque temps hier luttant avec des mises en page Android (... ou mieux des mises en page personnalisées). Pour des raisons générales, il s'agit des mises en page out of the box que les offres androïdes sont plus que suffisantes. Mais quand il s'agit de cas d'utilisation plus complexes (prenons l'exemple du carrousel avec chevauchement d'images qui sont posées sur un chemin elliptique), j'ai rapidement réalisé la limitation et la complexité des API Android. Ce fut mon approche:Mise en page personnalisée Android

  1. L'utilisation de la mise en page de la boîte est pas une option (à de nombreux problèmes difficiles à gérer à gérer), mais le besoin d'objets graphiques qui peuvent être ajoutés à un récipient (disons ImageView par exemple) est nécessaire pour effectuer facilement la traduction, les rotations, etc ... grâce à une animation intégrée. AbsoluteLayout semble être la disposition la plus raisonnable disponible à cet effet. Il permet d'ajouter des objets de vue dérivés et d'écrire votre propre algorithme pour les positionner. Mais ... c'est obsolète. C'est une honte! Qui veut utiliser des apis obsolètes? La prochaine chose la plus raisonnable à faire est d'écrire votre propre mise en page sous-classer le ViewGroup mystique .. et voici où tout se désintègre (au moins, il a fait pour moi). C'est compliqué, trompeur et difficile de le faire autant que d'écrire sa propre mise en page personnalisée pour le swing (je l'ai fait il y a des années, et je me souviens d'être plus simple). Ensuite, (sous l'effet du désespoir) sous-classer une vue, remplacer la méthode onDraw et dessiner directement sur un canevas semble la seule solution simple (bien que cela me rappelle les jours de java2D ... de longues heures passées à atteindre le 1% de votre projet), mais vous abandonnez les API d'animation intégrées que vous souhaitez appliquer aux graphiques dessinés sur le canevas.

La conclusion est que, à moins d'avoir manqué quelque chose, l'architecture Android actuelle est un peu loin du paradigme de la programmation offerte par d'autres technologies de l'interface utilisateur telles que le flash ou JavaFX (je peux facilement mettre en œuvre le carrousel décrit ci-dessus en javafx et flash). La raison en est que, dans javafx par exemple, l'objet Scene (comparable au concept View d'android) offre par défaut une disposition absolue. Vous pouvez ensuite appliquer d'autres mises en page de la boîte si vous le souhaitez. Mais pour les scénarios où une mise en page personnalisée est nécessaire, vous n'avez rien à faire.

Je suis un peu surpris que cette option n'est pas disponible dans Android, après tout, c'est un besoin assez commun qui est adressé par d'autres technologies ui. J'aime toujours penser qu'il y a une 5ème option dans android que je n'ai pas trouvée. Y at-il un expert qui pourrait fournir des informations sur le sujet?

Merci.

+2

Bonne question! Heres ma question à peu près la même: http://stackoverflow.com/questions/4953351/android-how-to-draw-a-letter-at-a-specific-point ... Pourquoi ont tous ces points de vue et animations si vous ne pouvez pas les utiliser? – Mark

Répondre

2

Ceci est une question FANTASTIQUE. Je suis en train de programmer pour 3.0 et plus actuellement, et j'ai décidé pour la plupart de rester avec AbsoluteLayouts dans de nombreux cas. Bien qu'il soit configuré pour être déprécié, la compilation pour 3.0ish et plus bas sera probablement capable de fonctionner sur les systèmes 4 et au-delà pour un peu. Im recherchant moi-même cette réponse (pour les futures versions de l'OS qui le découpent). La raison pour laquelle ils coupent est parce qu'il n'y a pas de standardisation de la résolution d'écran sur Android.Ma suggestion serait d'utiliser AbsoluteLayouts pour AS LONG COMME NOUS POUVONS. Je pense également que nous devrions commencer à pousser pour que Google sache que c'est encore une API très nécessaire pour leur plate-forme.

Grande question :-)

+0

[Par Dianne Hackborn de l'équipe de développement Android] (http://androiddiscuss.com/1-android-discuss/38183.html), "Je le répète: nous n'allons pas supprimer AbsoluteLayout d'une prochaine version, mais nous décourageons fortement les gens de l'utiliser. " Donc, si c'est vraiment ce qui répond le mieux à vos besoins, utilisez-le. – jk7

4

Je pense que Android mise en page sont parfaits pour plus cas d'utilisation pour interagir avec les utilisateurs, mais (un grand mais) le mécanisme de mise en page est très délicate et il est difficile d'étendre correctement. Pour les petits tweeks, c'est bien, mais si vous voulez faire quelque chose hors de l'ordinaire (comme un carrousel animé), vous faites probablement des graphismes gratuits de toute façon, vous n'avez donc pas besoin de la complexité supplémentaire d'étendre Layout. C'est juste plus de contraintes à vivre, sans valeur ajoutée justifiable.

La plupart des applications ont des éléments standard (ActionBar, boutons, préférences, boîtes de dialogue, etc.) et un ou plusieurs éléments "uniques". Donc, ma suggestion est d'utiliser la mise en page standard pour les choses standard, mais pour vos éléments uniques, utilisez l'un des éléments suivants:

1) SurfaceView - très facile à utiliser. Voir l'exemple de code officiel Lunar Lander. Pour voir SurfaceView en action, vous pouvez également regarder la vidéo my app, qui utilise SurfaceView pour l'élément animé, et tout est présenté avec RelativeLayout.

2) opengl - C'est le moyen le plus puissant de faire des graphiques sur Android. Il fonctionne sur le GPU, donc CPU peut être libre de faire d'autres choses. Et c'est 3D (ou 2D, si vous utilisez un seul plan). J'utilise libgdx, et c'est génial, et pas difficile après un court apprentissage.

deux SurfaceView et opengl (GLSurfaceView) sont des vues, de sorte qu'ils peuvent être ajoutés à une mise en page que tout autre point de vue

1

La documentation disponible sur les dispositions personnalisées me semble assez vague, mais j'ai finalement trouvé quelque chose d'utile: Voici une mise en page de l'exemple simple qui montre comment connecter le code XML et Java: How to layout a 'grid' of images in the center of the screen Et voici un article qui explique un problème clé qui me manquait: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/. Apparemment, il faut surcharger onMeasure et appeler measure() pour chaque enfant.