2010-02-03 6 views
43

J'ai besoin de savoir exactement quelle est la taille de l'écran sur l'appareil en unités de longueur réelle afin que je puisse calculer l'accélération due à la gravité en pixels par milliseconde.Existe-t-il un moyen de déterminer la hauteur de l'écran physique Android en cm ou en pouces?

Existe-t-il une méthode quelque part dans l'API Android pour cela?

+0

Si vous souhaitez effectuer une conversion unique (par exemple pour exporter des sprites depuis Photoshop ou concevoir votre mise en page pour une dimension physique), [voici un convertisseur astucieux] (http://pixplicity.com/dp- px-convertisseur /). –

Répondre

82

Utilisez les éléments suivants:

DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(mWidthPixels/dm.xdpi,2); 
    double y = Math.pow(mHeightPixels/dm.ydpi,2); 
    double screenInches = Math.sqrt(x+y); 
    Log.d("debug","Screen inches : " + screenInches); 

Lorsque mWidthPixels et mHeightPixels sont prises par le bas du code

private void setRealDeviceSizeInPixels() 
{ 
    WindowManager windowManager = getWindowManager(); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    display.getMetrics(displayMetrics); 


    // since SDK_INT = 1; 
    mWidthPixels = displayMetrics.widthPixels; 
    mHeightPixels = displayMetrics.heightPixels; 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) 
    { 
     try 
     { 
      mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
      mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
     } 
     catch (Exception ignored) 
     { 
     } 
    } 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 17) 
    { 
     try 
     { 
      Point realSize = new Point(); 
      Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); 
      mWidthPixels = realSize.x; 
      mHeightPixels = realSize.y; 
     } 
     catch (Exception ignored) 
     { 
     } 
    } 

Voir ce post pour référence: Get screen dimensions in pixels

+0

Fonctionne pour moi :) –

+8

J'ai ~ 15 appareils de test et il échoue sur certains d'entre eux, par exemple, il ne fonctionne pas sur certains modèles comme les téléphones Motorola Milestone ou ZTE. – STeN

+0

Les modèles de périphériques défectueux ont-ils une ROM personnalisée ou celle par défaut fournie par le fabricant? Peut-être que c'est quelque chose avec le ROM? –

-4

Vous devez utiliser la densité de l'écran pour calculer ceci.

Context.getResources().getDisplayMetrics().density 

Selon la documentation:

La densité logique de l'écran. Ceci est un facteur d'échelle pour l'unité Density Independent Pixel, où un DIP est un pixel sur un écran d'environ 160 dpi (par exemple un écran de 240 x 320, 1,5 "x2"), fournissant la ligne de base de l'affichage du système. Ainsi, sur un écran de 160 dpi, cette valeur de densité sera 1; sur un écran de 120 dpi, ce serait 0,75;

Cette valeur ne correspond pas exactement à la taille réelle de l'écran (donnée par xdpi et ydpi), mais sert plutôt à redimensionner la taille de l'interface utilisateur globale par paliers en fonction des changements bruts de la résolution d'affichage. un écran de 240x320 aura une densité de 1 même si sa largeur est de 1,8 ", 1,3", etc. Cependant, si la résolution de l'écran est augmentée à 320x480 mais que la taille de l'écran reste 1.5 "x2", la densité sera augmentée 1.5).

+2

Utilisez xdpi et ydpi comme décrit par l'autre affiche. La densité n'est délibérément pas un mappage absolu à la taille de l'écran physique, mais une unité plus abstraite qui peut être quantifiée à un petit nombre de valeurs discrètes (actuellement 120dpi, 160dpi, 240dpi). – hackbod

+0

Cette méthode est mauvaise et entraîne des valeurs inexactes pour les ppp et la résolution. – grebulon

4

android developers screen info.

utilisation xdpi * widthPixels et ydpi * heightPixels pourrait vous obtenir ce que vous voulez que je pense.

+3

Salut, certains modèles renvoie des valeurs incorrectes xdpi et ydpi, voir mon commentaire. – STeN

8

pour obtenir l'utilisation actuelle de la taille Math .round à la fin.

DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(dm.widthPixels/dm.xdpi,2); 
    double y = Math.pow(dm.heightPixels/dm.ydpi,2); 
    double screenInches = Math.sqrt(x+y); 
    Log.d("debug","Screen inches : " + screenInches); 

screenInches= (double)Math.round(screenInches * 10)/10; 
2

Après extrait de code vous aidera à obtenir Taille de l'écran en pouces

public static double getScreenSizeInches(Activity activity){ 
    WindowManager windowManager = activity.getWindowManager(); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    display.getMetrics(displayMetrics); 

    // since SDK_INT = 1; 
    int mWidthPixels = displayMetrics.widthPixels; 
    int mHeightPixels = displayMetrics.heightPixels; 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) { 
     try{ 
      mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
      mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
     } catch (Exception ignored) {} 
    } 

    // includes window decorations (statusbar bar/menu bar) 
    if (Build.VERSION.SDK_INT >= 17) { 
     try { 
      Point realSize = new Point(); 
      Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); 
      mWidthPixels = realSize.x; 
      mHeightPixels = realSize.y; 
     } catch (Exception ignored) {} 
    } 

    DisplayMetrics dm = new DisplayMetrics(); 
    activity.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(mWidthPixels/dm.xdpi, 2); 
    double y = Math.pow(mHeightPixels/dm.ydpi, 2); 
    return Math.sqrt(x + y); 
} 

espère que cette aide.