De bonnes résolutions pour Androïd...

Certes, je vous l'accorde, le jeu de mots vaseux contenu dans ce titre est un peu facile, mais je souhaiterais revenir sur un point particulièrement pénible sur Androïd - n'ayons pas peur des mots - : le choix de la taille de l'écran.



Nous venons de nous confronter au problème avec la sortie de nSports pour Android.
Le jeu a été développé, à la base, pour un Samung Galaxy SII, possédant une taille d'écran de 800 pixels sur 480 pixels.
Nous avons utilisé pour ce jeu la bibliothèque Cocos2D pour Androïd (dont, au passage, on ne vantera jamais assez les mérites ;) ).
Pour simplifier, nous avons donc développé tous les éléments graphiques pour la taille d'écran de 800x480.

Petit rappel de la situation sur iPhone

Apple, dans son infinie sagesse (si j'en fais trop, dîtes le moi ;) ), a eu la bonne idée - du moins, pour les développeurs - de strictement doubler la taille d'écran en passant de l'iPhone 3GS à l'iPhone 4, et de conserver l'ancien système de coordonnées.
En gros, le 3GS faisait 480x320, le 4 est passé à 960x640, soit un doublement exact des tailles - et donc le respect du même ratio hauteur / largeur.
En outre, le codage a conservé les coordonnées du 3GS, soit 480x320, pour tous les objets graphiques.
En somme, développer un programme compatible iPhone 3GS et iPhone 4 nécessite juste de fournir toutes les ressources graphiques en

  • simple définition
  • haute définition (suffixées notamment par @2x)

Et zou, votre programme fonctionne. Etonnant, non ? ;)

Et là, sur Androïd, ça se corse (préfecture Ajaccio)

Androïd, dès le début et les premières versions, a été conçu pour permettre quasiment toutes les fantaisies en terme d'écran pour les constructeurs.
Constructeurs, qui, bien sur, ne se sont pas privés. Parce question fantaisie, ils en connaissent un rayon.
En comptant toutes les versions d'Androïd, et toutes les tailles d'écran, OpenSignalMaps a compté 3997 versions différentes.
Et encore, ils en ont surement loupé quelques unes.
Et donc, vous, développeurs, êtes censé, lorsque vous développez, supporter toutes ces versions.
Ou pas.

"Dans la vie, faut faire des choix"

Il est évident que le petit développeur Androïd du coin ne va pas pouvoir supporter toutes ces combinaisons de matériel et de logiciel. Ne serait ce que parce physiquement, il ne pourra pas tout tester, et que parce que, niveau temps, il a autre chose à faire (et y a Burn Notice à la télé).
En ce qui nous concerne, nous avons décidé de restreindre le nombre d'appareils compatibles avec nSports.
On peut le faire, déjà, en spécifiant une version minimale d'Androïd supportée par l'application (qui correspond grosso modo à une version supportant le Google Play).
Et il est aussi possible de spécifier quels formats d'écran sont supportés.

"Mais alors, on est sauvé ?" vous écriez vous, tout à votre optimisme béat.

"Ben non, pas trop" vous rétorquerai-je, chafouin que je suis.

"Ben alors, cette résolution, on peut la fixer, oui ou bien ?"

En fait - mais le système a changé depuis le version 3.2 d'Androïd - on peut spécifier dans le manifeste les écrans supportés :


<supports-screens android:resizeable=["true"| "false"]
                  android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:xlargeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"]
                  android:requiresSmallestWidthDp="integer"
                  android:compatibleWidthLimitDp="integer"
                  android:largestWidthLimitDp="integer"/>

"Donc, on devrait pouvoir supporter le Small sans le Normal, non ?"

Non.
Carrément pas.

La compatibilité est voulue ascendante : si vous supportez une taille, vous supportez toutes les tailles supérieures.
Ex : si vous mettez :

<supports-screens android:smallScreens="false"
                  android:normalScreens="true"
                  android:largeScreens="false"
                  android:xlargeScreens="false"
                  />

Alors cela signifie que vous ne supportez pas la taille Small mais que vous supportez la taille Normal, et donc que vous supportez les tailles Large et XLarge, peu importe ce que vous avez spécifié pour les attributs de Large et XLarge.

C'est rude, ça. Sacrément rude.

De l'intérêt de tester sur des mobiles différents

Du coup, ce que nous avons fait pour nSports - et qui n'est pas, hélas, la solution la plus élégante, loin s'en faut - c'est d'interdire toutes les tailles d'écrans inférieures à 800x480, et, pour toutes les tailles supérieures, d'afficher - à la main - des bandes noires sur les côtés. Cocos2D, en outre, n'aide pas trop ce genre de situations.
Attention : ne perdez pas de vue que les périphériques Androïd n'ont pas de ratio hauteur / largeur fixé !! Il peut changer du tout au tout d'un téléphone à l'autre.

Conclusion

Avec la 3.2, de nouveaux qualificatifs pour la gestion de la taille écran sont apparus. Nous n'avons pas encore eu le temps de nous pencher sur le sujet, mais nul doute que cela améliore les choses.
Et, en y pensant, ce fonctionnement d'Androïd est sans doute pertinent : il force le développeur à gérer toutes les résolutions au delà de celle de son application, et donc le force à préparer l'avenir.
En outre, Androïd est quand même un système qui très tôt, a pensé à introduire la notion de Densité de Pixels (mais ça, on verra plus tard ;) ).
Et rien que pour ça, chapeau bas M. Google (ô, le vilain flagorneur !)

Si vous avez été confronté à ce problème, n'hésitez pas à réagir, je serais très intéressé de savoir comment vous l'avez résolu.
Previous
Next Post »