我试图了解Android中的sp单元,但我无法弄清楚它是如何工作的。 documentation说:
sp
与比例无关的像素 - 这就像dp单位,但它也是 按用户的字体大小首选项缩放。建议你使用 指定字体大小时,此单位将进行调整 屏幕密度和用户的偏好。
使用DisplayMetrics可以获得scaledDensity:
显示屏上显示的字体的缩放系数。这是一样的 作为密度,除了它可以在较小的增量调整 运行时基于用户对字体大小的首选项。
因此,鉴于此信息,我假设scaledDensity将随着我更改系统字体大小而改变,并且我可以使用此信息来了解1dp和1sp之间的比率(scaledDensity / density
)。
然而,当我在手机(Nexus 4)上测试时,我没有得到我期待的结果。 DisplayMetrics.scaledDensity始终返回相同的值(等于DisplayMetrics.density),无论我将手机设置为使用的字体大小(通过settings -> accessibility -> use large font
或settings -> display -> font size
)。
当我更改字体设置时,我指定的字体会改变大小,因此sp单元按预期工作,但scaledDensity值根本没有变化。
我用来获取scaledDensity的代码是:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity
我做错了什么或者我误解了DisplayMetrics.scaledDensity实际上做了什么?
更新
以下三个屏幕截图说明了我的意思:
这是应用程序的代码:
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
计算像素数量时,我得不到正确的值。
答案 0 :(得分:3)
缩放密度是度量单位,而不是字体大小的值。让我试着给你一个例子,如果你想要更多解释,请随时跟进评论。
假设您的字体大小为18sp。这需要转换为像素才能在屏幕上显示。进行以下计算:pixels = fontSize * scaledDensity * scale
。现在,当您更改手机的设置时,您正在更改 比例 。这导致进行相同的计算,但现在用比例为1.5而不是1来说.scaledDensity的单位不会因为你的屏幕像素密度没有改变而改变。
我希望有所帮助!