Question Obtenir les dimensions de l'écran en pixels


J'ai créé des éléments personnalisés, et je veux les placer par programme dans le coin supérieur droit (n pixels du bord supérieur et m pixels du bord droit). Par conséquent, j'ai besoin d'obtenir la largeur de l'écran et la hauteur de l'écran, puis définir la position:

int px = screenWidth - m;
int py = screenHeight - n;

Comment puis-je obtenir screenWidth et screenHeight dans l'activité principale?


1672
2018-06-19 08:25


origine


Réponses:


Si vous voulez les dimensions d'affichage en pixels, vous pouvez utiliser getSize:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Si vous n'êtes pas dans un Activity vous pouvez obtenir le défaut Display via WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

Avant getSize a été introduit (au niveau API 13), vous pouvez utiliser le getWidth et getHeight méthodes qui sont maintenant obsolètes:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

Cependant, pour le cas d'utilisation que vous décrivez, une marge / remplissage dans la disposition semble plus approprié.

Une autre façon est: DisplayMetrics

Structure décrivant des informations générales sur un affichage, telles que sa taille, sa densité et sa mise à l'échelle. Pour accéder aux membres DisplayMetrics, initialisez un objet comme celui-ci:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

On peut utiliser widthPixels obtenir des informations pour:

"La largeur absolue de l'affichage en pixels."

Exemple:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

3327
2018-06-19 08:41



Une façon est:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

Il est obsolète et vous devriez essayer le code suivant à la place. Les deux premières lignes de code vous donnent les objectifs DisplayMetrics. Cet objet contient les champs comme heightPixels, widthPixels.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int height = metrics.heightPixels;
int width = metrics.widthPixels;

350
2018-01-31 02:01



Il se peut qu'il ne réponde pas à votre question, mais il pourrait être utile de savoir (je le cherchais moi-même quand je suis arrivé à cette question) que si vous avez besoin d'une dimension, mais que votre code est en cours d'exécution (par exemple dans onCreate() ) vous pouvez configurer un ViewTreeObserver.OnGlobalLayoutListener avec View.getViewTreeObserver().addOnGlobalLayoutListener() et placez le code correspondant qui a besoin de la dimension de la vue. Le rappel de l'auditeur sera appelé lorsque la mise en page aura été mise en page.


111
2018-04-06 21:23



(La réponse de 2012, peut être périmée) Si vous voulez soutenir pré Honeycomb, vous devrez mettre en compatibilité ascendante avant API 13. Quelque chose comme:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

Bien sûr, les méthodes obsolètes seront éventuellement retirées des SDK les plus récents, mais alors que nous comptons toujours sur la plupart de nos utilisateurs ayant Android 2.1, 2.2 et 2.3, c'est ce qu'il nous reste.


103
2017-07-24 03:14



J'ai essayé toutes les "solutions" possibles sans succès et j'ai remarqué que l'application "Dalvik Explorer" d'Elliott Hughes montre toujours la bonne dimension sur n'importe quelle version d'appareil / système d'exploitation Android. J'ai fini par regarder son projet open source qui peut être trouvé ici: https://code.google.com/p/enh/

Voici tout le code pertinent:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

EDIT: version légèrement améliorée (éviter les exceptions de déclenchement sur une version de système d'exploitation non prise en charge):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} 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(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

62
2018-03-29 08:15



Pour accéder à la hauteur de la barre d'état pour les appareils Android, nous préférons un moyen programmatique pour l'obtenir:

Exemple de code

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

La variable result donne la hauteur dans le pixel.

Pour un accès rapide

Enter image description here

Pour plus d'informations sur la hauteur de Title bar, Navigation bar et Content View, veuillez regarder Tailles d'écran de périphérique Android.


43
2017-08-27 13:12



Manière la plus simple:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

42
2017-11-26 10:47



Première vue (par exemple par findViewById()) et vous pouvez utiliser getWidth () sur la vue elle-même.


28
2018-06-19 08:38



J'ai deux fonctions, l'une pour envoyer le contexte et l'autre pour obtenir la hauteur et la largeur en pixels:

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

et

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

24
2017-10-17 14:44



Pour la mise à l'échelle dynamique à l'aide de XML, il existe un attribut appelé "android: layout_weight".

L'exemple ci-dessous, modifié à partir de la réponse de synic sur ce fil, montre un bouton qui occupe 75% de l'écran (poids = 0,25) et une vue de texte occupant les 25% restants de l'écran (poids = 0,75).

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17
2017-12-22 06:11