Как конвертировать 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);