【发布时间】:2014-04-15 20:13:17
【问题描述】:
我试图了解 Android 中的 sp 单元,但我无法真正弄清楚它是如何工作的。 documentation 说:
sp
Scale-independent Pixels - 这就像 dp 单位,但它也是 按用户的字体大小偏好缩放。建议您使用 这个单位在指定字体大小时,因此它们将被调整为 屏幕密度和用户偏好。
使用DisplayMetrics 可以获得scaledDensity,即:
显示器上显示的字体的比例因子。这是一样的 作为密度,除了它可以在较小的增量调整 运行时基于用户对字体大小的偏好。
因此,鉴于此信息,我假设 scaledDensity 会随着我更改系统字体大小而改变,并且我可以使用此信息来了解 1dp 和 1sp 之间的比率 (scaledDensity / density)。
但是,当我在手机 (Nexus 4) 上对此进行测试时,我没有得到预期的结果。无论我将手机设置为哪种字体大小(通过settings -> accessibility -> use large font 或settings -> display -> font size),DisplayMetrics.scaledDensity 始终返回相同的值(等于 DisplayMetrics.density)。
当我更改字体设置时,我的 sp 指定的字体会更改大小,因此 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);
我希望能够计算 y 方向绘制某个字符串所需的像素数量。如果我使用 dp 指定字符串的大小,我可以使用displayMetrics.density 轻松计算所需的像素。但是当我使用 sp 并尝试使用 displayMetrics.scaledDensity 计算像素数量时,我没有得到正确的值。
【问题讨论】:
标签: android