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

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

4 ответов


DP к PX:

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

SP to PX:

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

DP к SP:

public static int dpToSp(float dp, Context context) {
    return (int) (dpToPx(dp, context) / context.getResources().getDisplayMetrics().scaledDensity);
}

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

SP to PX

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

или

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

PX to 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 к DP

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

Примечания

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

для преобразования размера в целое число или пиксель вам нужно использовать "getDimensionPixelSize(Р. Димена.your_dp_value)" функции, как...

сделайте значение в dimens.в XML

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

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

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

на kotlin Я создал функцию расширения:

fun Number.spToPx(context: Context) = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics).toInt()

вы можете использовать его как 16.spToPx(context) или 16.5.spToPx(context)

(я помещаю такие функции в KotlinExtensions.kt)