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



使用DisplayMetrics可以得到scaledDensity:



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

但是,当我在手机(Nexus 4)上进行测试时,却没有得到预期的结果。无论我已设置手机使用哪种字体大小(通过settings -> accessibility -> use large fontsettings -> 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源代码I found之后,scaledDensity属性被计算为scaledDensity = density * fontScale,其中fontScale取决于字体大小的系统设置。所以这就是我想的那样。

无论字体大小如何,scaledDensity始终对我具有相同的值的原因是因为我将DisplayMetrics用于错误的Display 。我从默认显示中获得了DisplayMetrics,对此documentation说:



在这种情况下,默认显示与系统的主显示不同,因此,当我更改系统字体设置时,该设置将在主显示而不是默认显示上更改。如果我更新代码以获取实际使用的显示器的DisplayMetrics,则scaledDensity返回根据系统字体设置缩放的期望值。

通过以下使用getResources().getDisplayMetrics()的更新代码,所有内容均可按预期工作:

DisplayMetrics metrics = getResources().getDisplayMetrics();
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(TypedValue.COMPLEX_UNIT_SP, 24);
((TextView) this.findViewById(R.id.dp)).setTextSize(TypedValue.COMPLEX_UNIT_DIP, 24);

通过这种获取显示指标的方式,这就是我得到的结果(观察缩放的密度如何随字体大小变化):

关于android - DisplayMetrics.scaledDensity在Android中实际返回什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22916490/

10-08 23:23