如何互相转换DP,PX,SP,特别是DP和SP?

我已经知道DPSPPX的区别了。 而在search这个话题后,我完全没有发现任何令人满意的东西 也许这个post是重复的,但是我仍然想知道从DPPX ,从DPSP ,从SPPX ,从PXSP ,从SPDP ,从DPSP的转换公式是什么? 我已经知道一些代码来做到这一点,但它们并不完美。

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; } 

请纠正我,如果我在最后一个错了,刚刚补上。

接受的答案是缺less一些有用的转换。

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; 

笔记

  • 上面select的花车( 2070 )是任意值。 你可以插入不同的数字,如果你喜欢。
  • px是指像素。 设备每英寸屏幕空间的像素数称为密度。
  • dp表示与密度无关的像素。 也就是说,不pipe使用什么设备,实际尺寸应该是一样的。 例如,如果我将视angular设置为100 dp宽,则在新的高密度电话上将具有与在旧的低密度电话上相同的宽度。 (如果将宽度设置为100 px ,另一方面,在低密度手机上看起来很大,在高密度手机上看起来很小)。密度是以每英寸点数(DPI)来衡量的。 公式是px = dp * density 。 所以你只是乘以或除以密度来转换pxdp
  • sp意味着与尺度无关的像素。 它只是用于字体,而不是视图。 它与dp类似,除了它也是用户偏好的因素。 考虑到用户偏好的密度被称为缩放密度。 例如,将TextView字体设置为30 sp的大小,将使文本在所有设备上通常显示为相同的物理大小。 但是,您的祖母在她的手机设置中可能会将自己喜欢的字体大小设置为最大,因此30 sp文本在手机上看起来会比在您的手机上看起来大一些。 公式是px = sp * scaledDensity
  • DP和SP的含义
  • DP到SP的转换通常不是有用的

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

在dimens.xml中创build一个值

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

现在,对于像素或整数值,您可以使用如下所示:

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