Obtenez la largeur et la hauteur de l'écran dans Android


477

Comment puis-je obtenir la largeur et la hauteur de l'écran et utiliser cette valeur dans:

@Override protected void onMeasure(int widthSpecId, int heightSpecId) {
    Log.e(TAG, "onMeasure" + widthSpecId);
    setMeasuredDimension(SCREEN_WIDTH, SCREEN_HEIGHT - 
        game.findViewById(R.id.flag).getHeight());
}

Réponses:


1002

En utilisant ce code, vous pouvez obtenir la largeur et la hauteur de l'affichage d'exécution:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

Dans une vue, vous devez faire quelque chose comme ceci:

((Activity) getContext()).getWindowManager()
                         .getDefaultDisplay()
                         .getMetrics(displayMetrics);

Dans certains scénarios, où les appareils ont une barre de navigation, vous devez vérifier lors de l'exécution:

public boolean showNavigationBar(Resources resources)
{
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
    return id > 0 && resources.getBoolean(id);
}

Si l'appareil dispose d'une barre de navigation, comptez sa hauteur:

private int getNavigationBarHeight() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

La hauteur finale de l'appareil est donc:

int height = displayMetrics.heightPixels + getNavigationBarHeight();

33
La largeur et la hauteur sont-elles inversées si l'appareil est tourné?
Madeyedexter

14
@Madeyedexter oui, ce sera le cas.
Parag Chauhan

1
Mais vous ne pouvez plus supposer que vous exécutez sur l'affichage par défaut.
satur9nine

1
ou utilisez simplement - getResources (). getDisplayMetrics (). heightPixels / getResources (). getDisplayMetrics (). widthPixels
Alex

1
@EpicPandaForce en fait je pensais à Android Oreo qui permet de lancer une activité sur un autre écran, voir ce qui suit: developer.android.com/reference/android/app/…
satur9nine

275

Il y a une réponse très simple et sans contexte de réussite

public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
}

public static int getScreenHeight() {
    return Resources.getSystem().getDisplayMetrics().heightPixels;
}

Remarque: si vous souhaitez que la hauteur inclue la barre de navigation, utilisez la méthode ci-dessous

WindowManager windowManager =
        (WindowManager) BaseApplication.getApplication().getSystemService(Context.WINDOW_SERVICE);
    final Display display = windowManager.getDefaultDisplay();
    Point outPoint = new Point();
    if (Build.VERSION.SDK_INT >= 19) {
        // include navigation bar
        display.getRealSize(outPoint);
    } else {
        // exclude navigation bar
        display.getSize(outPoint);
    }
    if (outPoint.y > outPoint.x) {
        mRealSizeHeight = outPoint.y;
        mRealSizeWidth = outPoint.x;
    } else {
        mRealSizeHeight = outPoint.x;
        mRealSizeWidth = outPoint.y;
    }

3
Comment obtenir la hauteur totale de l'écran? Cette version de getScreenHeight exclut toutes les barres.
Jaydev

1
cela fonctionne dans la plupart des cas, mais il ne peut pas obtenir la hauteur réelle de l'écran si la barre de navigation est visible. la hauteur exclut la hauteur de la barre.
L. Swifter

Cela a produit des résultats inhabituels pour moi en mode paysage
Carson Holzheimer

1
Cela causera des problèmes sur les écrans avec plusieurs écrans (pliables, ordinateurs portables Chrome OS)
EpicPandaForce

La hauteur de la barre de navigation n'est pas incluse dans Android 4.4
mstoic

45

Juste pour mettre à jour la réponse par parag et SpK pour l'aligner avec la compatibilité descendante actuelle du SDK à partir des méthodes obsolètes:

int Measuredwidth = 0;  
int Measuredheight = 0;  
Point size = new Point();
WindowManager w = getWindowManager();

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)    {
    w.getDefaultDisplay().getSize(size);
    Measuredwidth = size.x;
    Measuredheight = size.y; 
}else{
    Display d = w.getDefaultDisplay(); 
    Measuredwidth = d.getWidth(); 
    Measuredheight = d.getHeight(); 
}

7
@digiphd le code de Parang ne fonctionnerait-il pas sur toutes les versions d'API? Toutes les méthodes ont été introduites avant le niveau 8 de l'API et je ne les ai pas déconseillées sur le site de développement Android.
Sufian

@Sufian J'ai eu du mal à obtenir des valeurs de retour non nulles de la getSizemise en œuvre sur un Samsung Galaxy Mini (API 10) mais les méthodes déconseillées dans cette réponse reviennent correctement. C'est donc utile pour les anciennes versions d'Android.
Damien Diehl

@Sufian peut-on définir une nouvelle dimension pour la largeur et la hauteur de l'écran?
Srishti Roy

ceci est amorti maintenant :(
cegprakash

24

Pourquoi pas

DisplayMetrics displaymetrics = getResources (). GetDisplayMetrics ();

puis utilisez

displayMetrics.widthPixels (heightPixels)


13

Essayez le code ci-dessous: -

1.

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

2.

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

ou

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

3.

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

metrics.heightPixels;
metrics.widthPixels;

3
ne pensez-vous pas 2 = 4
Trikaldarshi

Signifie que votre méthode 2 est égale à la méthode 4
Trikaldarshi

Est-il possible d'obtenir la résolution "naturelle" de l'appareil? ce qui signifie que peu importe si vous faites pivoter l'écran, vous obtiendrez les mêmes valeurs pour la largeur et la hauteur, et que si c'est une tablette qui est destinée à être utilisée horizontalement, elle renverra la largeur en tant que grande au lieu de la hauteur?
développeur android

12

Il est très facile d'accéder à Android:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;

cela renvoie 0 sur un émulateur
l3ob

7

Pour les utilisateurs de kotlin

fun Activity.displayMetrics(): DisplayMetrics {
   val displayMetrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(displayMetrics)
   return displayMetrics
}

Et dans Activity, vous pouvez l'utiliser comme

     resources.displayMetrics.let { displayMetrics ->
        val height = displayMetrics.heightPixels
        val width = displayMetrics.widthPixels
    }

Ou en fragment

    activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }

6
DisplayMetrics dimension = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dimension);
        int width = dimension.widthPixels;
        int height = dimension.heightPixels;

6
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;

6

Obtenez la valeur de la largeur et de la hauteur de l'écran.

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

4
Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();

Obsolète, utilisez DisplayMetrics ()
deyanm

4
public class DisplayInfo {
    int screen_height=0, screen_width=0;
    WindowManager wm;
    DisplayMetrics displaymetrics;

    DisplayInfo(Context context) {
        getdisplayheightWidth(context);
    }

    void getdisplayheightWidth(Context context) {
        wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        displaymetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displaymetrics);
        screen_height = displaymetrics.heightPixels;
        screen_width = displaymetrics.widthPixels;
    }

    public int getScreen_height() {
        return screen_height;
    }

    public int getScreen_width() {
        return screen_width;
    }
}

4

Aucune des réponses ici ne fonctionne correctement pour les écrans multiples de Chrome OS ou les fichiers pliables à venir.

Lorsque vous recherchez la configuration actuelle, utilisez toujours la configuration de votre activité actuelle dans getResources().getConfiguration(). N'utilisez pas la configuration de votre activité d'arrière-plan ou celle de la ressource système. L'activité en arrière-plan n'a pas de taille et la configuration du système peut contenir plusieurs fenêtres avec des tailles et des orientations conflictuelles , donc aucune donnée utilisable ne peut être extraite.

La réponse est donc

val config = context.getResources().getConfiguration()
val (screenWidthPx, screenHeightPx) = config.screenWidthDp.dp to config.screenHeightDp.dp

3

Les méthodes présentées ici sont obsolètes / obsolètes mais cela fonctionne toujours. API 13 requise

Vérifiez-le

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

3

Façon complète de le faire, qui renvoie la vraie résolution:

            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Point size = new Point();
            wm.getDefaultDisplay().getRealSize(size);
            final int width = size.x, height = size.y;

Et comme cela peut changer selon une orientation différente, voici une solution (dans Kotlin), pour bien faire les choses quelle que soit l'orientation:

/**
 * returns the natural orientation of the device: Configuration.ORIENTATION_LANDSCAPE or Configuration.ORIENTATION_PORTRAIT .<br></br>
 * The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalOrientation(context: Context): Int {
    //based on : http://stackoverflow.com/a/9888357/878126
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val config = context.resources.configuration
    val rotation = windowManager.defaultDisplay.rotation
    return if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && config.orientation == Configuration.ORIENTATION_LANDSCAPE || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && config.orientation == Configuration.ORIENTATION_PORTRAIT)
        Configuration.ORIENTATION_LANDSCAPE
    else
        Configuration.ORIENTATION_PORTRAIT
}

/**
 * returns the natural screen size (in pixels). The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalSize(context: Context): Point {
    val screenNaturalOrientation = getScreenNaturalOrientation(context)
    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val point = Point()
    wm.defaultDisplay.getRealSize(point)
    val currentOrientation = context.resources.configuration.orientation
    if (currentOrientation == screenNaturalOrientation)
        return point
    else return Point(point.y, point.x)
}

1

Utilisez simplement la fonction ci-dessous qui renvoie la largeur et la hauteur de la taille de l'écran sous forme de tableau d'entiers

private int[] getScreenSIze(){
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int h = displaymetrics.heightPixels;
        int w = displaymetrics.widthPixels;

        int[] size={w,h};
        return size;

    }

Sur votre fonction ou bouton onCreate, cliquez sur Ajouter le code suivant pour afficher les tailles d'écran comme indiqué ci-dessous

 int[] screenSize= getScreenSIze();
        int width=screenSize[0];
        int height=screenSize[1];
        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);

1

Essayez ce code pour Kotlin

 val display = windowManager.defaultDisplay
 val size = Point()
 display.getSize(size)
 var DEVICE_WIDTH = size.x
 var DEVICE_HEIGHT = size.y

1

J'utilise le code suivant pour obtenir les dimensions de l'écran

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()

1

J'ai mis à jour la réponse pour la langue Kotlin!

Pour Kotlin: vous devez appeler le gestionnaire de fenêtres et obtenir des mesures. Après cette manière simple.

val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)

var width = displayMetrics.widthPixels
var height = displayMetrics.heightPixels

Comment pouvons-nous l'utiliser efficacement de manière indépendante avec le langage Kotlin?

Ici, j'ai créé une méthode dans la classe Kotlin générale. Vous pouvez l'utiliser dans toutes les activités.

private val T_GET_SCREEN_WIDTH:String = "screen_width"
private val T_GET_SCREEN_HEIGHT:String = "screen_height"

private fun getDeviceSizes(activity:Activity, whichSize:String):Int{

    val displayMetrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(displayMetrics)

    return when (whichSize){
        T_GET_SCREEN_WIDTH -> displayMetrics.widthPixels
        T_GET_SCREEN_HEIGHT -> displayMetrics.heightPixels
        else -> 0 // Error
    }
}

Contact: @canerkaseler


1
Une meilleure solution serait peut-être de créer une fonction d'extension pour la classe Activity.
Micer

0

J'ai trouvé la meilleure réponse de weigan dans cette page, voici comment vous pouvez l'utiliser dans Xamarin.Android:

public int GetScreenWidth()
{
    return Resources.System.DisplayMetrics.WidthPixels;
}

public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}

0

La résolution d'écran est le nombre total de pixels à l'écran. Le programme suivant extrait la résolution d'écran de l'appareil. Il imprimera la largeur et la hauteur de l'écran. Ces valeurs sont en pixels.

public static Point getScreenResolution(Context context) {
// get window managers
WindowManager manager =  (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point point = new Point();
display.getSize(point);

 // get width and height
 int width = point.x;
 int height = point.y;

 return point;

}



0

Deux étapes. Tout d'abord, étendez la classe Activity

class Example extends Activity

Deuxièmement: utilisez ce code

 DisplayMetrics displayMetrics = new DisplayMetrics();
 WindowManager windowmanager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
 windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
 int deviceWidth = displayMetrics.widthPixels;
 int deviceHeight = displayMetrics.heightPixels;

0
    int getScreenSize() {
        int screenSize = getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK;
//        String toastMsg = "Screen size is neither large, normal or small";
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        int orientation = display.getRotation();

        int i = 0;
        switch (screenSize) {

            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
//                toastMsg = "Large screen";
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 2;
                } else {
                    i = 1;
                }


                break;
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 4;
                } else {
                    i = 3;
                }

                break;


        }
//        customeToast(toastMsg);
        return i;
    }

-2
       @Override
        protected void onPostExecute(Drawable result) {
            Log.d("width",""+result.getIntrinsicWidth());
            urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 600);

            // change the reference of the current drawable to the result
            // from the HTTP call
            urlDrawable.drawable = result;

            // redraw the image by invalidating the container
            URLImageParser.this.container.invalidate();

            // For ICS
            URLImageParser.this.container.setHeight((400+URLImageParser.this.container.getHeight()
                    + result.getIntrinsicHeight()));

            // Pre ICS`enter code here`
            URLImageParser.this.container.setEllipsize(null);
        }

veuillez écrire quelques explications avec le code. les réponses codées uniquement sont généralement déconseillées dans SO --Review
Ram Ghadiyaram
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.