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