Obtén ancho y alto de pantalla en Android


477

¿Cómo puedo obtener el ancho y la altura de la pantalla y usar este valor en:

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

Respuestas:


1002

Con este código, puede obtener el ancho y la altura de la pantalla en tiempo de ejecución:

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

En una vista, debe hacer algo como esto:

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

En algunos escenarios, donde los dispositivos tienen una barra de navegación, debe verificar en tiempo de ejecución:

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

Si el dispositivo tiene una barra de navegación, cuente su altura:

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;
}

Entonces la altura final del dispositivo es:

int height = displayMetrics.heightPixels + getNavigationBarHeight();

33
¿Se intercambian el ancho y la altura si se gira el dispositivo?
Madeyedexter

14
@Madeyedexter sí lo hará.
Parag Chauhan

1
Pero ya no puede asumir que está ejecutando en la pantalla predeterminada.
sábado 9 de

1
o simplemente use - getResources (). getDisplayMetrics (). heightPixels / getResources (). getDisplayMetrics (). widthPixels
Alex

1
@EpicPandaForce en realidad estaba pensando en Android Oreo, que permite iniciar una actividad en otra pantalla, consulte lo siguiente: developer.android.com/reference/android/app/…
satur9nine

275

Hay una respuesta muy simple y sin contexto de aprobación.

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

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

Nota: si desea que la altura incluya la barra de navegación, use el método a continuación

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
¿Cómo obtener la altura total de la pantalla? Esta versión de getScreenHeight excluye todas las barras.
Jaydev

1
esto funciona en la mayoría de los casos, pero no puede obtener la altura real de la pantalla si la barra de navegación está visible. la altura excluye la altura de la barra.
L. Swifter

Esto produjo resultados inusuales para mí en modo horizontal
Carson Holzheimer el

1
Esto causará problemas en pantallas con múltiples pantallas (plegables, computadoras portátiles con sistema operativo Chrome)
EpicPandaForce

La altura de la barra de navegación no está incluida en Android 4.4
mstoic

45

Solo para actualizar la respuesta de parag y SpK para alinearla con la compatibilidad con SDK actual de métodos obsoletos:

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(); 
}

77
@digiphd ¿no funcionaría el código de Parang en todas las versiones de API? Todos los métodos se introdujeron antes del nivel 8 de API y no los encontré en desuso en el sitio de desarrollo de Android.
Sufian

@Sufian Tuve problemas para obtener valores de retorno distintos de 0 de la getSizeimplementación en un Samsung Galaxy Mini (API 10) pero los métodos obsoletos en esta respuesta regresan correctamente. Esto es útil para versiones anteriores de Android.
Damien Diehl el

@Sufian, ¿podemos establecer una nueva dimensión para el ancho y la altura de la pantalla?
Srishti Roy

esto se deprecia ahora :(
cegprakash

24

Por qué no

DisplayMetrics displaymetrics = getResources (). GetDisplayMetrics ();

luego usa

displayMetrics.widthPixels (heightPixels)


13

Pruebe el siguiente código: -

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

o

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

3)

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

metrics.heightPixels;
metrics.widthPixels;

3
no crees 2 = 4
Trikaldarshi

Significa que su método 2 es igual al método 4
Trikaldarshi

¿Es posible obtener la resolución "natural" del dispositivo? lo que significa que no importa si gira la pantalla, obtendrá los mismos valores de ancho y alto, y que si se trata de una tableta que debe usarse horizontalmente, ¿devolverá el ancho como el grande en lugar de la altura?
Desarrollador de Android

12

Es muy fácil entrar en Android:

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

esto devuelve 0 en un emulador
l3ob

7

Para usuarios de kotlin

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

Y en Activity puedes usarlo como

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

O en fragmento

    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

Obtenga el valor del ancho y alto de la pantalla.

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();

En desuso, use 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

Ninguna de las respuestas aquí funciona correctamente para las pantallas múltiples de Chrome OS, o para las próximas carpetas plegables.

Cuando busque la configuración actual, use siempre la configuración de su actividad actual en getResources().getConfiguration(). No utilice la configuración de su actividad en segundo plano o la del recurso del sistema. La actividad en segundo plano no tiene un tamaño, y la configuración del sistema puede contener múltiples ventanas con tamaños y orientaciones conflictivas , por lo que no se pueden extraer datos utilizables.

Entonces la respuesta es

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

3

Los métodos que se muestran aquí están en desuso / desactualizados, pero esto todavía funciona. Requiere API 13

Echale un vistazo

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

3

Forma completa de hacerlo, que devuelve la verdadera resolución:

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

Y dado que esto puede cambiar en una orientación diferente, aquí hay una solución (en Kotlin), para hacerlo bien sin importar la orientación:

/**
 * 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

Simplemente use la función a continuación que devuelve el ancho y la altura del tamaño de la pantalla como una matriz de enteros

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;

    }

En su función onCreate o haga clic en el botón, agregue el siguiente código para generar los tamaños de pantalla como se muestra a continuación

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

1

Prueba este código para Kotlin

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

1

Yo uso el siguiente código para obtener las dimensiones de la pantalla

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

1

¡Actualicé la respuesta para el idioma Kotlin!

Para Kotlin: debe llamar al Administrador de ventanas y obtener métricas. Después de esa manera fácil.

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

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

¿Cómo podemos usarlo efectivamente en forma de actividad independiente con el lenguaje Kotlin?

Aquí, creé un método en la clase general de Kotlin. Puedes usarlo en todas las actividades.

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
    }
}

Contacto: @canerkaseler


1
Quizás una solución aún mejor sería crear una función de extensión para la clase Actividad.
Micer

0

He encontrado Weigan respuesta 's mejor en esta página, aquí es cómo se puede utilizar en la que Xamarin.Android:

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

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

0

La resolución de la pantalla es el número total de píxeles en la pantalla. El siguiente programa extraerá la resolución de pantalla del dispositivo. Imprimirá el ancho y la altura de la pantalla. Esos valores están en píxeles.

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

Dos pasos. Primero, extienda la clase de actividad

class Example extends Activity

Segundo: usa este código

 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);
        }

por favor escriba alguna explicación junto con el código. las respuestas de solo código generalmente se desaconsejan en SO
Ram Ghadiyaram
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.