DP、PX、SP之间如何相互转换,尤其是DP和SP?
How to convert DP, PX, SP among each other, especially DP and SP?
我知道DP、SP和PX的区别。在搜索这个主题之后,我发现没有什么能让我完全满意的。也许这个 post 是重复的,但我仍然想知道从 DP 转换为 PX 的公式是什么,以及 DP 到 SP,从 SP 到 PX,从 PX 到 SP,从 SP 到 DP,从 DP 到 SP?我知道一些代码可以做到这一点,但它们并不完美。
DP 到 PX:
public static int dpToPx(float dp, Context context) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}
SP 到 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);
}
要将维度转换为整数或像素,您需要使用“getDimensionPixelSize(R.dimen.your_dp_value)”函数,点赞。 ..
在dimens.xml
中创建一个值
<dimen name="padding_10">10dp</dimen>
现在,对于以像素或整数表示的值,您可以如下使用:
int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
接受的答案缺少一些有用的转换。
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 转 DP
float px = 70;
float dp = px / getResources().getDisplayMetrics().density;
备注
- 我在上面选择的浮点数(
20
和 70
)是任意值。如果你愿意,你可以插入不同的数字。
px
指的是像素。设备每英寸屏幕的像素数 space 称为密度。
dp
表示 density-independent 像素。即不管用什么设备,实际大小应该是一样的。例如,如果我将视图设置为 100 dp
宽,那么它在新的高密度 phone 上的宽度将与在旧的低密度 phone 上的宽度相同。 (另一方面,如果我将宽度设置为 100 px
,它会在低密度 phone 上显得大而在高密度 phone 上显得小。)密度以点为单位每英寸 (DPI)。公式为px = dp * density
。因此,您只需乘以或除以密度即可在 px
和 dp
之间进行转换。
sp
表示 scale-independant 像素。它只用于字体,不用于视图。它与 dp
类似,只是它还考虑了用户偏好。这种考虑了用户偏好的密度称为缩放密度。例如,将 TextView
字体的大小设置为 30 sp
,将使文本在所有设备上通常显示为相同的物理大小。但是,您的祖母可能在 phone 设置中将她喜欢的字体大小一直调到最大,因此 30 sp
文本在她 phone 上看起来比在您身上看起来更大。公式为px = sp * scaledDensity
.
- Meaning of DP and SP
- DP 到 SP 的转换通常没有用
对于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
文件中)
您可以编写一个方法,不需要 context
或 resources
:
public static int dpToPx(int dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
public static int spToPx(int sp) {
return (int) (sp * Resources.getSystem().getDisplayMetrics().scaledDensity);
}
以此类推,其他量可以换算
根据 TypedValue#applyDimension 源代码并利用 Kotlin 扩展:
val Float.toSp get() = this * Resources.getSystem().displayMetrics.scaledDensity
来自 link
的其他扩展
val Float.toPx get() = this * Resources.getSystem().displayMetrics.density
val Float.toDp get() = this / Resources.getSystem().displayMetrics.density
我知道DP、SP和PX的区别。在搜索这个主题之后,我发现没有什么能让我完全满意的。也许这个 post 是重复的,但我仍然想知道从 DP 转换为 PX 的公式是什么,以及 DP 到 SP,从 SP 到 PX,从 PX 到 SP,从 SP 到 DP,从 DP 到 SP?我知道一些代码可以做到这一点,但它们并不完美。
DP 到 PX:
public static int dpToPx(float dp, Context context) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}
SP 到 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);
}
要将维度转换为整数或像素,您需要使用“getDimensionPixelSize(R.dimen.your_dp_value)”函数,点赞。 ..
在dimens.xml
中创建一个值<dimen name="padding_10">10dp</dimen>
现在,对于以像素或整数表示的值,您可以如下使用:
int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
接受的答案缺少一些有用的转换。
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 转 DP
float px = 70;
float dp = px / getResources().getDisplayMetrics().density;
备注
- 我在上面选择的浮点数(
20
和70
)是任意值。如果你愿意,你可以插入不同的数字。 px
指的是像素。设备每英寸屏幕的像素数 space 称为密度。dp
表示 density-independent 像素。即不管用什么设备,实际大小应该是一样的。例如,如果我将视图设置为100 dp
宽,那么它在新的高密度 phone 上的宽度将与在旧的低密度 phone 上的宽度相同。 (另一方面,如果我将宽度设置为100 px
,它会在低密度 phone 上显得大而在高密度 phone 上显得小。)密度以点为单位每英寸 (DPI)。公式为px = dp * density
。因此,您只需乘以或除以密度即可在px
和dp
之间进行转换。sp
表示 scale-independant 像素。它只用于字体,不用于视图。它与dp
类似,只是它还考虑了用户偏好。这种考虑了用户偏好的密度称为缩放密度。例如,将TextView
字体的大小设置为30 sp
,将使文本在所有设备上通常显示为相同的物理大小。但是,您的祖母可能在 phone 设置中将她喜欢的字体大小一直调到最大,因此30 sp
文本在她 phone 上看起来比在您身上看起来更大。公式为px = sp * scaledDensity
.- Meaning of DP and SP
- DP 到 SP 的转换通常没有用
对于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
文件中)
您可以编写一个方法,不需要 context
或 resources
:
public static int dpToPx(int dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
public static int spToPx(int sp) {
return (int) (sp * Resources.getSystem().getDisplayMetrics().scaledDensity);
}
以此类推,其他量可以换算
根据 TypedValue#applyDimension 源代码并利用 Kotlin 扩展:
val Float.toSp get() = this * Resources.getSystem().displayMetrics.scaledDensity
来自 link
的其他扩展val Float.toPx get() = this * Resources.getSystem().displayMetrics.density
val Float.toDp get() = this / Resources.getSystem().displayMetrics.density