Получить ширину и высоту экрана в Android

477

Как я могу получить ширину и высоту экрана и использовать это значение в:

@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
источник
2
см .: stackoverflow.com/questions/1016896/…
будет Тейт

Ответы:

1002

Используя этот код, вы можете получить ширину и высоту экрана во время выполнения:

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

В представлении вам нужно сделать что-то вроде этого:

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

В некоторых сценариях, где устройства имеют панель навигации, вы должны проверить во время выполнения:

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

Если на устройстве есть панель навигации, то посчитайте ее высоту:

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

Итак, итоговая высота устройства составляет:

int height = displayMetrics.heightPixels + getNavigationBarHeight();
Параг Чаухан
источник
33
Изменяются ли ширина и высота, если устройство вращается?
Madeyedexter
14
@Madeyedexter да, это будет.
Параг Чаухан
1
Но вы больше не можете предполагать, что работаете на дисплее по умолчанию.
satur9nine
1
или просто используйте - getResources (). getDisplayMetrics (). heightPixels / getResources (). getDisplayMetrics (). widthPixels
Алекс
1
@EpicPandaForce на самом деле я думал об Android Oreo, который позволяет запускать активность на другом дисплее, см. Следующее: developer.android.com/reference/android/app/…
satur9nine
275

Есть очень простой ответ и без проходного контекста

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

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

Примечание: если вы хотите, чтобы высота включала панель навигации, используйте метод ниже

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
источник
3
Как узнать общую высоту экрана? Эта версия getScreenHeight исключает все бары.
Джайдев
1
это работает в большинстве случаев, но не может получить реальную высоту экрана, если видна панель навигации. высота исключает высоту бара.
Л. Свифтер
Это дало мне необычные результаты в ландшафтном режиме
Карсон
1
Это вызовет проблемы на экранах с несколькими дисплеями (складные, ноутбуки с Chrome OS)
EpicPandaForce
Высота панели навигации не включена в Android 4.4
mstoic
45

Просто чтобы обновить ответ с помощью parag и SpK, чтобы он соответствовал текущей обратной совместимости SDK из устаревших методов:

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
источник
7
@digiphd не будет ли код Паранга работать на всех версиях API? Все методы были введены до уровня API 8, и я не нашел их устаревшими на сайте разработчика Android.
Суфий
@Sufian У меня были проблемы с получением ненулевых возвращаемых значений из getSizeреализации на Samsung Galaxy Mini (API 10), но устаревшие методы в этом ответе возвращаются правильно. Так что это полезно для старых версий Android.
Дэмиен Дил
@Sufian мы можем установить новое измерение ширины и высоты экрана?
Сришти Рой
это обесценивается сейчас :(
cegprakash
24

Почему бы нет

DisplayMetrics displaymetrics = getResources (). GetDisplayMetrics ();

затем используйте

displayMetrics.widthPixels (heightPixels)

wangqi060934
источник
13

Попробуйте следующий код: -

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

или

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

3.

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

metrics.heightPixels;
metrics.widthPixels;
Дуггу
источник
3
ты не думаешь 2 = 4
Трикалдарши
Значит ваш метод 2 равен методу 4
Трикалдарши
Возможно ли получить «естественное» разрешение устройства? Это означает, что независимо от того, поворачиваете ли вы экран, вы получите одинаковые значения для ширины и высоты, и что если это планшет, предназначенный для горизонтального использования, он вернет ширину как большую, а не высоту?
Android-разработчик
12

Это очень легко получить в Android:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;
Несс Тяги
источник
это возвращает 0 на эмуляторе
l3ob
7

Для пользователя kotlin

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

И в Activity вы можете использовать его как

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

Или во фрагменте

    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;
Shubham
источник
6

Получить значение ширины и высоты экрана.

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();
Рахул Ядав
источник
Устаревший, используйте 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

Ни один из ответов здесь не работает правильно для нескольких дисплеев Chrome OS или для будущих складных складных плат.

При поиске текущей конфигурации всегда используйте конфигурацию из текущей активности в getResources().getConfiguration(). Не используйте конфигурацию из фоновой активности или из системного ресурса. Фоновое действие не имеет размера, и конфигурация системы может содержать несколько окон с конфликтующими размерами и ориентациями , поэтому никакие используемые данные не могут быть извлечены.

Так что ответ

val config = context.getResources().getConfiguration()
val (screenWidthPx, screenHeightPx) = config.screenWidthDp.dp to config.screenHeightDp.dp
EpicPandaForce
источник
3

Показанные здесь методы устарели / устарели, но это все еще работает. Требуется API 13

проверить это

Display disp= getWindowManager().getDefaultDisplay();
Point dimensions = new Point();
disp.getSize(size);
int width = size.x;
int height = size.y;
Хемант Шори
источник
3

Полный способ сделать это, который возвращает истинное разрешение:

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

И поскольку это может измениться в зависимости от ориентации, вот решение (в Kotlin), чтобы получить его правильно, независимо от ориентации:

/**
 * 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)
}
разработчик Android
источник
1

Просто используйте функцию ниже, которая возвращает ширину и высоту размера экрана в виде массива целых чисел

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;

    }

В функции onCreate или нажатии кнопки добавьте следующий код для вывода размеров экрана, как показано ниже

 int[] screenSize= getScreenSIze();
        int width=screenSize[0];
        int height=screenSize[1];
        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);
Даниэль Ньямасьо
источник
1

Попробуйте этот код для Kotlin

 val display = windowManager.defaultDisplay
 val size = Point()
 display.getSize(size)
 var DEVICE_WIDTH = size.x
 var DEVICE_HEIGHT = size.y
Наджиб Ахмед Путавала
источник
1

Я использую следующий код, чтобы получить размеры экрана

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()
Harsha
источник
1

Я обновил ответ на котлинском языке!

Для Kotlin: Вы должны позвонить в Window Manager и получить метрики. После этого легкого пути.

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

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

Как мы можем эффективно использовать его в самостоятельной деятельности с языком Kotlin?

Здесь я создал метод общего класса Kotlin. Вы можете использовать его во всех мероприятиях.

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

Контакт: @canerkaseler

canerkaseler
источник
1
Возможно, даже лучшим решением было бы создание функции расширения для класса Activity.
Майкер
0

Я нашел лучший ответ Вейгана на этой странице, вот как вы можете использовать его в Xamarin.Android:

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

public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}
Мехди Дехгани
источник
0

Разрешение экрана - общее количество пикселей на экране. Следующая программа будет распаковывать разрешение экрана устройства. Он напечатает ширину и высоту экрана. Эти значения в пикселях.

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

Это набор утилит для работы с абстракцией размера в Android.

Он содержит класс SizeFromDisplay.java. Вы можете использовать его следующим образом:

ISize size = new SizeFromDisplay(getWindowManager().getDefaultDisplay());
size.width();
size.hight();
Олег Соколов
источник
0

Два шага Во-первых, расширить класс деятельности

class Example extends Activity

Второе: используйте этот код

 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
источник
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
источник
-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);
        }
Аруттан Ару
источник
пожалуйста, напишите некоторое объяснение вместе с кодом. Ответы, содержащие только код, как правило, не приветствуются в SO
Рам Гадиярам