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

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();
Parag Chauhan
fuente
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;
    }
Weigan
fuente
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(); 
}
digiphd
fuente
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)

wangqi060934
fuente
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;
duggu
fuente
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;
Ness Tyagi
fuente
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
    }
Ali mohammadi
fuente
6
DisplayMetrics dimension = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dimension);
        int width = dimension.widthPixels;
        int height = dimension.heightPixels;
Cristiana Chavez
fuente
6
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;
Shubham
fuente
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;
Anil Singhania
fuente
4
Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();
Rahul Yadav
fuente
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;
    }
}
Habibur Rahman Ovie
fuente
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
EpicPandaForce
fuente
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;
Hemant Shori
fuente
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)
}
desarrollador de Android
fuente
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);
Daniel Nyamasyo
fuente
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
Najib Ahmed Puthawala
fuente
1

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

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()
Harsha
fuente
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

Canerkaseler
fuente
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;
}
Mehdi Dehghani
fuente
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;

}

Faxriddin Abdullayev
fuente
0

Este conjunto de utilidades para trabajar con la abstracción de tamaño en Android.

Contiene una clase SizeFromDisplay.java Puede usarlo así:

ISize size = new SizeFromDisplay(getWindowManager().getDefaultDisplay());
size.width();
size.hight();
Oleh Sokolov
fuente
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;
dgamer
fuente
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;
    }
pruthwiraj.kadam
fuente
-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);
        }
Aruttan Aru
fuente
por favor escriba alguna explicación junto con el código. las respuestas de solo código generalmente se desaconsejan en SO
Ram Ghadiyaram