Compréhension de la mise à l’échelle de la méta-fenêtre d’affichage Android: qu’est-ce qui me manque?

J’ai essayé de déterminer comment la fenêtre d’affichage – et le contenu de celle-ci – sont affectés par la balise META de fenêtre d’affichage utilisée pour dessiner du contenu avec WebView ou avec le navigateur natif.

Ce que j’ai rencontré sont des incohérences apparentes. J’ai créé une petite page (voir ci-dessous) avec une image et du javascript pour afficher la taille de la fenêtre afin que je puisse voir visuellement la mise à l’échelle avec l’image et obtenir les chiffres exacts.

Tout d’abord, quelques observations:

  1. Aucun des nombres de largeur de la fenêtre d’affichage n’est exactement ce que j’attendais, fermez simplement.
  2. Lorsque les nombres sont proches du nombre de pixels de l’appareil, le dessin est en réalité fait un pour un – ou du moins est visiblement de cette manière.
  3. Si la taille de la page (taille du document) est inférieure à la taille de la fenêtre d’affichage, les numéros de la fenêtre d’affichage diminuent. C’est-à-dire que la fenêtre ne représente pas nécessairement l’espace maximal possible, mais uniquement l’espace visible actuel.
  4. De même, dans le navigateur natif, la taille de la fenêtre d’affichage est ajustée par la barre supérieure. La taille augmente à mesure qu’elle défile de l’écran. Les numéros donnés sont pour l’affichage plein écran.

Device # 1: L’écran physique est 1024×600 et il tourne sous Android 2.2.

  1. échelle initiale = 1.0 => 676×400
  2. échelle initiale = 1.0, largeur = largeur de périphérique => 676×400
  3. échelle initiale = 2, largeur = largeur de périphérique => 338×200
  4. échelle initiale = 2, largeur = largeur du périphérique, densité-densitédpi = périphérique-dpi => 507×300
  5. échelle initiale = 0.5, width = device-width, target-densitédpi = device-dpi => 800×473
  6. échelle initiale = 0.9, width = device-width, target-densitydpi = device-dpi => 800×473
  7. width = device-width, target-densitédpi = device-dpi => 1014×600
  8. échelle initiale = 1.0, largeur = largeur de périphérique, densité-cibledpi = dpi-périphérique => 1014×600
  9. échelle initiale = 0.5, largeur = largeur du périphérique, densité-cibledpi = ppp-périphérique, échelle minimale = 0.1 => 2028×768
  10. échelle initiale = 0,5, largeur = largeur de périphérique, densité de cibledpi = ppp-périphérique, échelle minimale = 0,1, modifiable par l’utilisateur = non => 1014 x 600

Device # 2: L’écran physique est 800×480 et il tourne sous Android 2.3.2.

  1. échelle initiale = 1.0 => 527×320
  2. échelle initiale = 1.0, largeur = largeur de périphérique => 527×320
  3. échelle initiale = 2, largeur = largeur de périphérique => 263×160
  4. échelle initiale = 2, largeur = largeur du périphérique, densité-densitédpi = périphérique-dpi => 395×240
  5. échelle initiale = 0.5, largeur = largeur de périphérique, target-densitédpi = device-dpi => 790×480
  6. échelle initiale = 1.0, largeur = largeur de périphérique, densité-cibledpi = périphérique-dpi => 790×480
  7. échelle initiale = 0.5, largeur = largeur du périphérique, densité-cibledpi = ppp-périphérique, échelle minimale = 0.1 => 1580×768
  8. échelle initiale = 0,5, largeur = largeur de périphérique, densité de cibledpi = dpi de périphérique, échelle minimale = 0,1, modifiable par l’utilisateur = non => 790 x 480
  9. width = 1580, target-densitédpi = device-dpi => 790×480
  10. width = 1580, target-densitédpi = device-dpi => 790×480
  11. width = 1580, target-densitédpi = dpi-périphérique, échelle minimale = 0.1 => 790×480

Parmi ces résultats, les suivants n’ont pas de sens:

  1. Dispositif n ° 1, articles 5, 6 et 10
  2. Dispositif n ° 2, articles 5, 8, 10, 11, 12

Est-ce que quelqu’un sait ce qui se passe avec ceux qui n’ont pas de sens?

Est-ce que quelqu’un sait pourquoi la plupart des valeurs ont 10 pixels de moins que les pixels physiques, mais ce résultat est comme si elles correspondaient? (ex: 1.7 et 2.6)

Est-ce que je fais quelque chose de mal, ou semble-t-il impossible de faire un zoom arrière au-delà de 1,0, à moins que l’utilisateur ne soit autorisé à mettre à l’échelle et que la valeur minimale soit définie?

En d’autres termes, même si les valeurs valides sont comsockets entre 0,01 et 10, les valeurs d’échelle initiales inférieures à 1,0 sont ignorées, sauf si vous pouvez également définir l’échelle minimale.

Les documents Android indiquent que lorsque les données sont évolutives, les valeurs min / max ne sont pas sockets en compte. Cela ne semble pas très utile. Et 2.9-2.11 semblent montrer que vous ne pouvez pas simplement le calculer vous-même et définir la largeur.

Enfin, le code HTML que j’utilise:

      
Hello world.
$("#bl1").click(function(){ var pageWidth = $(document).width(); var pageHeight = $(document).height(); var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); $("#bld").html("Page width: "+pageWidth+"
pageHeight: "+pageHeight+"
port width: "+viewportWidth+"
port height: "+viewportHeight); });

Alors … qu’est ce qui me manque?

Canette intéressante de vers que vous avez ouverte là-bas. Au fur et à mesure que vous essayez plus d’appareils, vous verrez probablement encore plus de bizarreries et de bugs aléatoires. Temps intéressants! 🙂

Je pense que quelque part, vous voudrez peut-être abandonner, et essayez simplement de …

  • Restez avec des parameters aussi simples que possible.
  • Acceptez la largeur en pixels que l’appareil choisit de signaler.
  • Faites confiance à la disposition adaptative / fluide et aux largeurs relatives pour que les choses fonctionnent sur différentes largeurs d’écran.
  • Utilisez les propriétés CSS natives pour obtenir un rendu neutre en résolution des coins, des ombres et des dégradés arrondis.
  • Utiliser autant que possible des formats vectoriels (svg, fontes d’icons, etc.)
  • et ( important ) Utilisez les border-image haute résolution ainsi que background-image associées à la propriété de background-size bien supscope 1 pour rendre les choses plus claires et nettes 2 .

1) Pour assurer la rétrocompatibilité aux navigateurs plus anciens (comme MSIE8), vous devez utiliser des déclarations à double background-image , comme par exemple:

 background-image: url(low-res.png); /* CSS2 */ background-image: url(high-res.png), none; /* CSS3 */ background-size: 100px 10px; /* CSS3 */ 

2) La requête média -webkit-max-device-pixel-ratio peut également aider, mais comme son nom l’indique, elle ne fonctionne que pour les navigateurs Webkit.


Randonnée:

Les appareils Android et iOS de nouvelle génération ont des DPI d’écran tellement différents qu’ils ont eu recours à la déclaration des pixels CSS plutôt qu’aux pixels réels de l’appareil. Ceci est à la fois bon ou mauvais – en fonction de la façon dont vous le regardez.

C’est mauvais parce que vous n’êtes plus assuré du contrôle de pixel par appareil que vous aviez l’habitude d’avoir, de travailler avec les écrans les plus homogènes du passé.

D’un autre côté, c’est bien parce que vous savez que vos conceptions ne seront jamais si petites qu’elles ne peuvent pas être lues / utilisées par des humains ordinaires.

Le problème avec l’utilisation de target-densitydpi=device-dpi est que, même s’il fonctionne à merveille sur un écran de 800 pouces de largeur, il gâchera complètement votre application sur un écran de 960 pixels de large.

 $(document).ready(function() { $('meta[name=viewport]').attr('content','width=1024, user-scalable=no'); }); 

Semble fonctionner pour désactiver la mise à l’échelle de l’utilisateur après l’application correcte de la mise à l’échelle