DisplayMetrics.scaledDensity在Android中实际返回了什么?

时间:2014-04-07 15:16:29

标签: android

我试图了解Android中的sp单元,但我无法弄清楚它是如何工作的。 documentation说:

  

sp

     

与比例无关的像素 - 这就像dp单位,但它也是   按用户的字体大小首选项缩放。建议你使用   指定字体大小时,此单位将进行调整   屏幕密度和用户的偏好。

使用DisplayMetrics可以获得scaledDensity

  

显示屏上显示的字体的缩放系数。这是一样的   作为密度,除了它可以在较小的增量调整   运行时基于用户对字体大小的首选项。

因此,鉴于此信息,我假设scaledDensity将随着我更改系统字体大小而改变,并且我可以使用此信息来了解1dp和1sp之间的比率(scaledDensity / density)。

然而,当我在手机(Nexus 4)上测试时,我没有得到我期待的结果。 DisplayMetrics.scaledDensity始终返回相同的值(等于DisplayMetrics.density),无论我将手机设置为使用的字体大小(通过settings -> accessibility -> use large fontsettings -> display -> font size)。

当我更改字体设置时,我指定的字体会改变大小,因此sp单元按预期工作,但scaledDensity值根本没有变化。

我用来获取scaledDensity的代码是:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity

我做错了什么或者我误解了DisplayMetrics.scaledDensity实际上做了什么?

更新

以下三个屏幕截图说明了我的意思:

enter image description here

这是应用程序的代码:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

String result = "\n"
    + "density : " + metrics.density + " (24 dp = " + 24 * metrics.density + " px)\n"
    + "scaledDensity: " + metrics.scaledDensity + " (24 sp = " + 24 * metrics.scaledDensity + " px)\n";

((TextView) this.findViewById(R.id. label)).setText(result);
((TextView) this.findViewById(R.id. sp)).setTextSize(android.util.TypedValue. COMPLEX_UNIT_SP , 24);
((TextView) this.findViewById(R.id.dp )).setTextSize(android.util.TypedValue. COMPLEX_UNIT_DIP, 24);

我希望能够计算绘制某个字符串所需的像素数量。如果我使用dp指定字符串的大小,我可以使用displayMetrics.density轻松计算所需的像素。但是当我使用sp并尝试使用displayMetrics.scaledDensity计算像素数量时,我得不到正确的值。

1 个答案:

答案 0 :(得分:3)

缩放密度是度量单位,而不是字体大小的值。让我试着给你一个例子,如果你想要更多解释,请随时跟进评论。

假设您的字体大小为18sp。这需要转换为像素才能在屏幕上显示。进行以下计算:pixels = fontSize * scaledDensity * scale。现在,当您更改手机的设置时,您正在更改 比例 。这导致进行相同的计算,但现在用比例为1.5而不是1来说.scaledDensity的单位不会因为你的屏幕像素密度没有改变而改变。

我希望有所帮助!