Comment puis-je connaître la taille de mon écran par programmation, dans les unités utilisées par les événements tactiles et Afficher la mesure / la disposition? En d'autres termes, je veux les coordonnées du coin inférieur droit de l'écran, dans le système de coordonnées utilisé par les événements tactiles
getRawX()/getRawY()et View.getLocationOnScreen().
J'hésite à appeler les unités d'événements / vues souhaitées "pixels" car il y a évidemment plusieurs notions de "pixels" sur mon téléphone dans différents modes, et elles ne constituent pas une histoire cohérente.
Je vois que cela a été beaucoup demandé et répondu sur stackoverflow et ailleurs, mais aucune des réponses ne fonctionne réellement sur mon téléphone (droid 4, android 4.1.2) dans tous les modes:
- Puis-je connaître la largeur de l'écran par programmation dans l'application Android?
- Comment obtenir le ScreenSize par programmation dans Android
- Android défini Afficher la visibilité par programmation en fonction de la taille de l'écran
- Comment obtenir la hauteur de l'écran sous Android?
- Obtenez la hauteur de l'écran sous Android
- https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
- http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
- http://coderock.net/how-to-determine-screen-resolution-programmatically/
- http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
- Android et réglage de la largeur et de la hauteur par programmation en unités dp
- http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
- http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
- http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically
(sensationnel!)
Ceci est pour le code de bibliothèque qui doit fonctionner indépendamment du fait que l'application soit en "mode de compatibilité d'écran" (c'est-à-dire targetSdkVersion <= 10 dans le manifeste) ou non, et je ne veux pas non plus faire d'hypothèses sur la position, la taille , ou l'existence de la barre d'état ou de toute autre décoration d'écran similaire.
Voici les faits:
mon téléphone (un droid 4 sous Android 4.1.2) a 540x960 pixels physiques, c'est-à-dire de petits points lumineux colorés.
la taille de l'écran dans les unités souhaitées, à partir de la visualisation des événements tactiles et de l'affichage des mesures, est de 360x640 lorsque l'application est en mode de compatibilité d'écran, 540x960 lorsque l'application n'est pas en mode de compatibilité d'écran. Ce sont les nombres que j'ai besoin de trouver par programme, sans me faufiler avec des événements tactiles ou des vues pour les trouver, mais j'ai une difficulté extrême à trouver une API qui renverra ces nombres.
Les objets Display et DisplayMetrics obtenus de diverses manières prétendent tous que la taille de l'écran est de 540x960 "pixels" (que ce soit en mode de compatibilité d'écran ou non). Pour être précis, les éléments suivants disent tous 540x960 tout le temps: DisplayMetrics. {Width, height} Pixels, Display.getSize (), Display.getRealSize (), Display.get {Width, Height} (),
Les objets de configuration obtenus de différentes manières disent tous écran {Largeur, Hauteur} Dp = 360x614 (que ce soit en mode compatibilité écran ou non). Je ne pense pas que cela représente tout l'écran, car le rapport hauteur / largeur est incorrect. (Je pense que c'est tout l'écran moins la barre d'état; j'ai besoin de tout l'écran.) Je pense qu'il est prudent de dire que l'écran entier est de 360x640 dp, bien que je ne connaisse aucune API qui renvoie ce 640.
DisplayMetrics obtenus de diverses manières disent que la «densité» est de 1,0f en mode de compatibilité d'écran, de 1,5f en mode de compatibilité d'écran.
L'activité
getWindow().getAttributes().{width,height}n'est pas utile car elle contient généralementMATCH_PARENTdes tailles plutôt que réelles. Mais je ne peux apparemment obtenir la réponse d'une activité de choixgetWindow().getDecorView().getMeasured{Width,Height}()( ce qui est surprenant en fait depuis decorView de la fenêtre de l'activité n'a pas l' air comme ça prend tout l'écran, on dirait qu'il prend l'écran moins la barre d'état). Mais je ne veux pas me fier à cela parce que si la fenêtre est redimensionnée (un clavier logiciel apparaît? Quelqu'un appelle window.setAttributes ()? Ou peut-être que je ne suis pas du tout dans une activité), cela va clairement être tout faux.
Je comprends que la formule suivante est censée tenir: pixels = dp * densité Cela semble être en accord avec tous les nombres rapportés ((3), (4), (5) ci-dessus) lorsque vous n'êtes pas en mode de compatibilité d'écran: 540x960 = 360x640 * 1.5 Mais en mode de compatibilité d'écran, cela ne correspond pas: 540x960! = 360x640 * 1 Donc, quelque chose ne va pas.
L'explication la plus simple, je pense, est que les méthodes énumérées dans (3) ci-dessus donnent simplement la mauvaise réponse pour "pixels" en mode de compatibilité d'écran - c'est-à-dire qu'elles étaient destinées à renvoyer 360x640 "pixels" mais elles sont à tort renvoyant 540x960 à la place. Mais il peut y avoir d'autres façons de voir les choses.
Dans tous les cas, obtenir les nombres souhaités quel que soit le mode, à partir des pièces de puzzle ci-dessus, est certainement un casse-tête délicat. J'ai trouvé un moyen qui semble fonctionner sur mon téléphone dans les deux modes, mais il est extrêmement détourné et repose sur deux hypothèses qui semblent encore assez incertaines (comme décrit dans les commentaires de code ci-dessous).
Voici ma recette:
/** get screen size in "pixels", i.e. touchevent/view units.
* on my droid 4, this is 360x640 or 540x960
* depending on whether the app is in screen compatibility mode
* (i.e. targetSdkVersion<=10 in the manifest) or not. */
public void getScreenSizePixels(int widthHeightInPixels[/*2*/])
{
Resources resources = getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
// Note, screenHeightDp isn't reliable
// (it seems to be too small by the height of the status bar),
// but we assume screenWidthDp is reliable.
// Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels
// (they get confused when in screen compatibility mode, it seems),
// but we assume their ratio is correct.
double screenWidthInPixels = (double)config.screenWidthDp * dm.density;
double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels;
widthHeightInPixels[0] = (int)(screenWidthInPixels + .5);
widthHeightInPixels[1] = (int)(screenHeightInPixels + .5);
}
Existe-t-il un moyen meilleur / plus propre de trouver la taille de l'écran?
DisplayMetricsne soit jamais mise à jour de ces modifications. Il y a déjà des problèmes comme celui-ci .