Как узнать сколько px равен переданный в xml значение в dp?

Вот написал программу, которая автоматический изменяет размеры View элементов исходя из того, на каком устройстве программа запускается.

Появилась проблема в связи с правильным изменением размеров этих элементов в автоматическом режиме при определенных ситуации, и из за того, что я изначально все значения передал в dp а не в px - появились лишние проблемы.

Вот к примеру. Превью выполняется в режиме width:height (1080:1920); 420dpi

Как узнать, сколько пикселей равна скажем width одного View элемента, если я дал значение скажем 100dp?

Или как узнать сколько dp равны width и height всего экрана?

Естественно, 420dpi не может означать что и width и height равны 420dp. Это даже на превью без каких либо расчетов видно.

Прочитал конечно это инфо в startandroid

Для того, чтобы избежать таких ситуаций на разных разрешениях рекомендуется использовать dp (и sp). Его можно определить, как масштабируемый px. За степень масштабируемости отвечает Screen Density. Это коэффициент, который используется системой для вычисления значения dp. На текущий момент есть 5 значений этого коэффициента:

  • low (ldpi) = 0,75

  • medium (mdpi) = 1

  • tv (tvdpi) = 1,33

  • high (hdpi) = 1,5

  • extra high (xhdpi) = 2

Т.е. когда для экрана стоит режим mdpi, то 1 dp = 1 px. Т.е. кнопка шириной 100 dp будет выглядеть также как и кнопка шириной 100 px.

Если, например, у нас экран с низким разрешением, то используется режим ldpi. В этом случае 1 dp = 0,75 px. Т.е. кнопка шириной 100 dp будет выглядеть так же как кнопка шириной 75 px.

Если у нас экран с высоким разрешением, то используется режим hdpi или xhdpi. 1 dp = 1, 5 px или 2 px. И кнопка шириной 100 dp будет выглядеть так же как кнопка шириной 150 px или 200 px.

Т.е. при различных разрешениях используются различные Density режимы, которые позволяют приложениям масштабироваться и выглядеть если не одинаково, то, по крайне мере, похоже на всех экранах.

Но как мне понять как сделать правильный расчет? К примеру как узнать, в каком режиме из выше перечисленных вариантов отображается превью и результат во время запуска в моем телефоне?


Ответы (1 шт):

Автор решения: Alex_Skvortsov

Вы можете получить значение в dp, зная значение в пикселях:

final float scale = getContext().getResources().getDisplayMetrics().density; //множитель
int px = ...; //известное значение в пикселях
int dp = (int) ((px - 0.5f) / scale); //полученное значение в dp

Очевидно, зная значение в dp, можно получить значение в px:

int px = (int) ((dp * scale) + 0.5f)

Варианты превью в студии:

введите сюда описание изображения

→ Ссылка