Obter largura e altura da tela no Android

477

Como posso obter a largura e a altura da tela e usar esse valor em:

@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
fonte

Respostas:

1001

Usando esse código, você pode obter a largura e altura da tela de tempo de execução:

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

Em uma visão, você precisa fazer algo assim:

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

Em alguns cenários, onde os dispositivos têm uma barra de navegação, é necessário verificar no tempo de execução:

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

Se o dispositivo tiver uma barra de navegação, conte sua 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;
}

Portanto, a altura final do dispositivo é:

int height = displayMetrics.heightPixels + getNavigationBarHeight();
Parag Chauhan
fonte
33
A largura e a altura são trocadas se o dispositivo for girado?
Madeyedexter
14
@Madeyedexter sim, será.
Parag Chauhan 28/11
1
Mas você não pode mais assumir que está executando na exibição padrão.
Satur9nine
1
ou simplesmente usar - getResources () getDisplayMetrics () heightPixels / getResources () getDisplayMetrics () widthPixels....
Alex
1
@EpicPandaForce na verdade eu estava pensando em Oreo Android que permite o lançamento de uma atividade em outra tela, consulte o seguinte: developer.android.com/reference/android/app/...
satur9nine
275

Existe uma resposta muito simples e sem contexto de passe

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

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

Nota: se você quiser que a altura inclua a barra de navegação, use o método abaixo

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
fonte
3
Como obter a altura total da tela? Esta versão do getScreenHeight exclui todas as barras.
precisa
1
isso funciona na maioria dos casos, mas não pode obter a altura real da tela se a barra de navegação estiver visível. a altura exclui a altura da barra.
L.L. Swifter
Isso produziu resultados incomuns para mim no modo paisagem
Carson Holzheimer
1
Isto irá causar problemas em telas com múltiplos monitores (Foldables, notebooks Chrome OS)
EpicPandaForce
A altura da barra de navegação não está incluído no Android 4.4
mstoic
45

Apenas para atualizar a resposta por parag e SpK para alinhar com a compatibilidade com versões anteriores do SDK atual de métodos descontinuados:

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
fonte
7
@digiphd O código de Parang não funcionaria em todas as versões da API? Todos os métodos foram introduzidos antes do nível 8 da API e não os achei obsoletos no site de desenvolvimento do Android.
Sufian
@ Suufian Eu tive problemas para obter valores de retorno diferentes de zero da getSizeimplementação em um Samsung Galaxy Mini (API 10), mas os métodos descontinuados nesta resposta retornam corretamente. Portanto, isso é útil para versões mais antigas do Android.
Damien Diehl
@Sufian, podemos definir uma nova dimensão para a largura e altura da tela?
Srishti Roy
isso é depreciado agora :(
cegprakash
24

Por que não

DisplayMetrics displaymetrics = getResources (). GetDisplayMetrics ();

então use

displayMetrics.widthPixels (heightPixels)

wangqi060934
fonte
13

Experimente o código abaixo: -

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;
duggu
fonte
3
não acha 2 = 4
Trikaldarshi
Significa que seu método 2 é igual ao método 4
Trikaldarshi
É possível obter a resolução "natural" do dispositivo? o que significa que, independentemente de você girar a tela, você obterá os mesmos valores para largura e altura e, se for um tablet que deve ser usado horizontalmente, retornará a largura como maior em vez da altura?
desenvolvedor android
12

É muito fácil entrar no Android:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;
Ness Tyagi
fonte
isso retorna 0 em um emulador
l3ob 9/02
7

Para usuários do kotlin

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

E no Activity você pode usá-lo como

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

Ou em fragmento

    activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }
Ali mohammadi
fonte
6
DisplayMetrics dimension = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dimension);
        int width = dimension.widthPixels;
        int height = dimension.heightPixels;
Cristiana Chavez
fonte
6
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;
Shubham
fonte
6

Obtenha o valor da largura e altura da tela.

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
Anil Singhania
fonte
4
Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();
Rahul Yadav
fonte
Descontinuado, 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
fonte
4

Nenhuma das respostas aqui funciona corretamente em vários monitores do Chrome OS ou em dobráveis ​​em breve.

Ao procurar a configuração atual, sempre use a configuração da sua atividade atual em getResources().getConfiguration(). Não use a configuração da sua atividade em segundo plano ou a do recurso do sistema. A atividade em segundo plano não possui um tamanho e a configuração do sistema pode conter várias janelas com tamanhos e orientações conflitantes ; portanto, nenhum dado utilizável pode ser extraído.

Então a resposta é

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

Os métodos mostrados aqui estão obsoletos / desatualizados, mas isso ainda está funcionando.

Confira

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

Maneira completa de fazê-lo, que retorna a verdadeira resolução:

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

E, como isso pode mudar em orientações diferentes, eis uma solução (no Kotlin), para acertar, independentemente da orientação:

/**
 * 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)
}
desenvolvedor android
fonte
1

Basta usar a função abaixo que retorna a largura e a altura do tamanho da tela como uma matriz de números inteiros

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;

    }

Na função ou botão onCreate, clique em adicionar o código a seguir para exibir os tamanhos de tela, como mostrado abaixo

 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
fonte
1

Experimente 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
fonte
1

Eu uso o código a seguir para obter as dimensões da tela

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()
Harsha
fonte
1

Eu atualizei a resposta para o idioma Kotlin!

Para Kotlin: você deve ligar para o Window Manager e obter métricas. Depois dessa maneira fácil.

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

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

Como podemos usá-lo efetivamente de maneira independente para atividades com a linguagem Kotlin?

Aqui, eu criei um método na classe Kotlin geral. Você pode usá-lo em todas as atividades.

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

Contato: @canerkaseler

canerkaseler
fonte
1
Talvez uma solução ainda melhor seria criar uma função de extensão para a classe Activity.
Micer
0

Eu achei a melhor resposta de weigan nesta página, eis como você pode usá-la em Xamarin.Android:

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

public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}
Mehdi Dehghani
fonte
0

A resolução da tela é o total de pixels na tela. O programa a seguir extrairá a resolução da tela do dispositivo. Ele imprimirá a largura e a altura da tela. Esses valores estão em pixel.

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
fonte
0

Este conjunto de utilitários para trabalhar com a abstração de tamanho no Android.

Ele contém uma classe SizeFromDisplay.java Você pode usá-lo assim:

ISize size = new SizeFromDisplay(getWindowManager().getDefaultDisplay());
size.width();
size.hight();
Oleh Sokolov
fonte
0

Dois passos. Primeiro, estenda a classe Activity

class Example extends Activity

Segundo: use 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
fonte
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
fonte
-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
fonte
por favor, escreva alguma explicação junto com o código. código só respostas são geralmente desencorajado no que --Review
Ram Ghadiyaram