Как конвертировать DP, PX, SP между собой, особенно DP и SP?

Я знал разницу между DP, SP и PX. И после поиска этой темы, я не нашел ничего, удовлетворяющего меня полностью. Возможно, этот пост является дубликатом, но я все еще хочу знать, что такое формула преобразования из DP в PX и DP в SP, от SP до PX, от PX до SP, от SP до DP, от DP до SP? Я знаю некоторые коды, чтобы сделать это, но они несовершенны.

Ответ 1

От DP до PX:

public static int convertDpToPixels(float dp, Context context) {
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
    return px; 
}

SP к PX:

public static int convertSpToPixels(float sp, Context context) {
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
    return px; 
}

DP до SP: (зачем вам это нужно?)

public static int convertDpToSp(float dp, Context context) {
    int sp = (int) (convertDpToPixels(dp, context) / (float) convertSpToPixels(dp, context));
    return sp;
}

Пожалуйста, поправьте меня, если я ошибаюсь в последнем, сделал это сейчас.

Ответ 2

В принятом ответе отсутствует несколько полезных преобразований.

SP до PX

float sp = 20;
float px = sp * getResources().getDisplayMetrics().scaledDensity;

или

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());

PX в SP

float px = 70;
float sp = px / getResources().getDisplayMetrics().scaledDensity;

от DP до PX

float dp = 20;
float px = dp * getResources().getDisplayMetrics().density;

или

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());

PX to DP

float px = 70;
float dp = px / getResources().getDisplayMetrics().density;

Примечания

  • Поплавки, которые я выбрал выше (20 и 70), были произвольными значениями. Вы можете подключить разные номера, если хотите.
  • px относится к пикселям. Количество пикселей, которое устройство имеет на дюйм пространства экрана, называется плотностью.
  • dp означает не зависящие от плотности пиксели. То есть, независимо от того, какое устройство используется, фактический размер должен быть одинаковым. Например, если я устанавливаю вид 100 dp wide, он будет иметь такую ​​же ширину на новом телефоне с высокой плотностью, как на старом телефоне с низкой плотностью. (Если бы я установил ширину на 100 px, с другой стороны, она была бы большой на телефоне с низкой плотностью и маленькой на телефоне с высокой плотностью.) Плотность измеряется в точках на дюйм (DPI). Формула px = dp * density. Таким образом, вы просто умножаете или делите на плотность для преобразования между px и dp.
  • sp означает не зависящие от масштаба изображения пиксели. Он просто используется для шрифтов, а не для просмотра. Он похож на dp, за исключением того, что он также влияет на предпочтения пользователя. Эта плотность с учетом предпочтений пользователя известна как масштабированная плотность. Например, установка шрифта TextView на размер 30 sp приведет к тому, что текст, как правило, будет иметь одинаковый физический размер на всех устройствах. Тем не менее, у вашей бабушки может быть предпочтительный размер шрифта, максимально установленный в ее настройках телефона, поэтому текст 30 sp будет выглядеть больше на ее телефоне, чем на вашем телефоне. Формула px = sp * scaledDensity.
  • Значение DP и SP
  • Преобразование DP в SP обычно не полезно

Ответ 3

Для преобразования Dimension в Integer или Pixel вам нужно использовать функцию getDimensionPixelSize (R.dimen.your_dp_value), как...

Сделать значение в dimens.xml

<dimen name="padding_10">10dp</dimen>

Теперь для этого значения в пикселе или целое число можно использовать как показано ниже:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);