Получить размеры экрана в пикселях - PullRequest
1777 голосов
/ 19 июня 2009

Я создал несколько пользовательских элементов и хочу программно разместить их в верхнем правом углу (n пикселей от верхнего края и m пикселей от правого края). Поэтому мне нужно получить ширину экрана и высоту экрана, а затем установить положение:

int px = screenWidth - m;
int py = screenHeight - n;

Как мне получить screenWidth и screenHeight в основной активности?

Ответы [ 39 ]

3420 голосов
/ 19 июня 2009

Если вы хотите размеры экрана в пикселях, вы можете использовать getSize:

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

Если вы не в Activity, вы можете получить значение по умолчанию Display через WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

Если вы во фрагменте и хотите выполнить это, просто используйте Activity.WindowManager (в Xamarin.Android) или getActivity (). GetWindowManager () (в java).

До введения getSize (на уровне API 13) вы могли использовать методы getWidth и getHeight, которые сейчас не рекомендуются:

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

Однако для описываемого вами варианта использования поле / отступ в макете кажется более подходящим.

Другой способ: DisplayMetrics

Структура, описывающая общую информацию об дисплее, такую ​​как его размер, плотность и масштабирование шрифта. Чтобы получить доступ к членам DisplayMetrics, инициализируйте объект следующим образом:

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

Мы можем использовать widthPixels, чтобы получить информацию для:

"Абсолютная ширина дисплея в пикселях."

Пример:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
360 голосов
/ 31 января 2011

Один из способов:

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

Это устарело, и вместо этого вы должны попробовать следующий код. Первые две строки кода дают вам DisplayMetrics объекты. Этот объект содержит поля типа heightPixels, widthPixels.

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;
114 голосов
/ 07 апреля 2011

Он может не отвечать на ваш вопрос, но было бы полезно знать (я сам искал его, когда пришел к этому вопросу), что если вам нужно измерение View, но ваш код выполняется, когда его макет еще не был пока что (например, в onCreate()) вы можете настроить ViewTreeObserver.OnGlobalLayoutListener с помощью View.getViewTreeObserver().addOnGlobalLayoutListener() и поместить туда соответствующий код, который нуждается в измерении вида. Обратный вызов слушателя будет вызван, когда макет будет размечен.

104 голосов
/ 24 июля 2012

(ответ 2012 г., возможно, устарел). Если вы хотите поддерживать предварительно Honeycomb, вам нужно будет установить обратную совместимость до API 13. Что-то вроде:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

Конечно, устаревшие методы в конечном итоге будут удалены из самых последних SDK, но, хотя мы по-прежнему полагаемся на большинство наших пользователей, имеющих Android 2.1, 2.2 и 2.3, это то, что нам осталось.

65 голосов
/ 29 марта 2013

Я безуспешно перепробовал все возможные «решения» и заметил, что приложение «Dalvik Explorer» Эллиотта Хьюза всегда показывает правильный размер на любом устройстве Android / версии ОС. В итоге я посмотрел на его проект с открытым исходным кодом, который можно найти здесь: https://code.google.com/p/enh/

Вот весь соответствующий код:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

РЕДАКТИРОВАТЬ: немного улучшенная версия (избегать исключений запуска на не поддерживаемой версии ОС):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}
46 голосов
/ 26 ноября 2014

Самый простой способ:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 
46 голосов
/ 27 августа 2013

Для доступа к высоте строки состояния для устройств Android мы предпочитаем программный способ ее получения:

Пример кода

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

Переменная result дает высоту в пикселе.

Для быстрого доступа

Enter image description here

Дополнительную информацию о высоте Title bar, Navigation bar и Content View см. На Размерах экрана устройства Android .

30 голосов
/ 19 июня 2009

Сначала получите представление (например, findViewById()), а затем вы можете использовать getWidth () для самого представления.

26 голосов
/ 17 октября 2012

У меня есть две функции, одна для отправки контекста, а другая для получения высоты и ширины в пикселях:

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

и

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}
17 голосов
/ 22 декабря 2011

Для динамического масштабирования с использованием XML есть атрибут с именем "android: layout_weight"

В приведенном ниже примере, измененном из ответа synic на в этой теме , показана кнопка, занимающая 75% экрана (вес = .25), и текстовое представление, занимающее оставшиеся 25% экран (вес = 0,75).

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>
...