我试图了解Android中的sp单元,但是我真的无法弄清楚它是如何工作的。 documentation说:
使用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源代码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/