如何将DP,PX,SP相互转换,尤其是DP和SP?

Sil*_*ght 53 android pixel density-independent-pixel

我知道DP,SPPX之间的区别.在搜索了这个主题后,我发现没有什么能让我完全满意.也许这篇文章是重复的,但我仍然想知道从DPPX,DPSP,从SPPX,从PXSP,从SPDP,从DPSP的转换公式是什么?我知道一些代码可以做到这一点,但它们并不完美.

And*_*dEx 136

DP到PX:

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

SP到PX:

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

DP到SP:

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

  • SP一个是错的正确的公共静态INT convertDpToSp(浮动DP,上下文的背景下){回报(INT)(convertDpToPixels(DP,上下文)/ context.getResources()getDisplayMetrics()scaledDensity.); } (2认同)

Sur*_*gch 50

接受的答案是缺少一些有用的转换.

SP到PX

float sp = 20;
float px = sp * getResources().getDisplayMetrics().scaledDensity;
Run Code Online (Sandbox Code Playgroud)

要么

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

PX到SP

float px = 70;
float sp = px / getResources().getDisplayMetrics().scaledDensity;
Run Code Online (Sandbox Code Playgroud)

DP到PX

float dp = 20;
float px = dp * getResources().getDisplayMetrics().density;
Run Code Online (Sandbox Code Playgroud)

要么

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

PX到DP

float px = 70;
float dp = px / getResources().getDisplayMetrics().density;
Run Code Online (Sandbox Code Playgroud)

笔记

  • 我在上面选择的浮点数(2070)是任意值.如果您愿意,可以插入不同的号码.
  • 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的转换通常不常用


var*_*jsi 8

要将维度转换为整数或像素,您需要使用“ getDimensionPixelSize(R.dimen.your_dp_value) ”函数,例如...

在 dimens.xml 中创建一个值

<dimen name="padding_10">10dp</dimen>
Run Code Online (Sandbox Code Playgroud)

现在对于像素或整数的那个值,您可以使用如下:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
Run Code Online (Sandbox Code Playgroud)


ved*_*ant 6

因为kotlin我创建了一个扩展函数:

fun Number.spToPx(context: Context) = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics).toInt()
Run Code Online (Sandbox Code Playgroud)

你可以像16.spToPx(context)16.5.spToPx(context)

(我将这些功能放在一个KotlinExtensions.kt文件中)