Android getDisplayMetrics() не возвращает точный размер экрана

Я пытаюсь получить ширину/высоту устройства в пикселях для размещения элементов и отображения сенсорных событий на экране, но не получаю желаемого эффекта (обратите внимание, что нижний правый квадрат должен быть полностью заподлицо с нижним правым):

Белый квадрат должен быть заподлицо в правом нижнем углу

// screen size
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float ScrDensity = metrics.density;
    int metricHeight = metrics.heightPixels;//
    int metricWidth = metrics.widthPixels;//

    Log.i("AllMetrics", metrics.toString());

    // temp
    int rightButton_diameter = 100;
    int rightButton_xpos = metricWidth - rightButton_diameter;
    int rightButton_ypos = metricHeight - rightButton_diameter;

Где AllMetrics возвращает:

DisplayMetrics{density=2.0, width=720, height=1184, scaledDensity=2.0, xdpi=320.0, ydpi=320.0}

Я заметил, что возвращаемая высота также отличается от 720x1280, указанной в диспетчере виртуальных устройств (API 19, Android 4.4), а положения x/y событий касания кажутся точными для нарисованных элементов (т. е. область нажатия кнопки там же, где и рисуется)

Это ошибка конфигурации или я использую неправильный метод получения положения на экране?


person Gavin    schedule 23.07.2016    source источник
comment
высота = 1184, поскольку она не включает высоту строки состояния, которая равна 96, эти два числа, сложенные вместе, дают 1280, что является физической высотой экрана.   -  person pskink    schedule 23.07.2016
comment
Кстати, чего именно вы хотите достичь?   -  person pskink    schedule 23.07.2016
comment
Просто аккуратно расставьте предметы на экране для начала. Я заметил, что если я рисую, начиная с 0,0, он находится на одном уровне с верхним левым. Разве строка состояния не должна смещать это значение на 69? В противном случае ему просто не хватает высоты снизу, а не сверху.   -  person Gavin    schedule 23.07.2016
comment
я понятия не имею, что вы имеете в виду, извините   -  person pskink    schedule 23.07.2016
comment
Вы все нашли разумное решение? Я стою перед той же дилеммой.   -  person IgorGanapolsky    schedule 13.02.2017


Ответы (2)


Проверьте этот код, он работает для меня

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

Вне деятельности вы можете попробовать это

 ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm)
person Yogesh Rathi    schedule 23.07.2016
comment
Насколько я понимаю, getWindowManager() нельзя использовать вне основного действия? (и действительно возвращает «невозможно разрешить метод», когда я пытаюсь его использовать) Извините, если я ошибаюсь. Это мой первый фурор в Android-разработке. - person Gavin; 23.07.2016
comment
если вы хотите использовать внешнюю активность, контекст активности передачи... удачи. - person Yogesh Rathi; 23.07.2016
comment
Доступ к нему осуществляется только как к методу основного контекста действия? Использование: this.mainActivityContext.getWindowManager().getDefaultDisplay().getMetrics(dm); возвращает ту же проблему, getWindowManager() не решен. - person Gavin; 25.07.2016
comment
я обновляю и, пожалуйста, проверьте, теперь он работает, я проверяю на лолипопе - person Yogesh Rathi; 26.07.2016
comment
Это возвращает 1794 пикс. для Nexus 5X, тогда как должно быть 1920 пикс.: material.io/devices - person IgorGanapolsky; 13.02.2017

Чтобы получить доступ к членам DisplayMetrics, инициализируйте объект следующим образом:

Показатели DisplayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(метрики);

person shekhar pande    schedule 23.07.2016