先上个图,可以通过Paint指定textSize获取到相关信息。
通过代码获取相应的信息:
-
mPaint.setTextSize(80); *//设置字体为斜体* mPaint.setTypeface(Typeface.create("", Typeface.ITALIC)); *// FontMetrics对象* FontMetricsInt fontMetrics = mPaint.getFontMetricsInt(); fontMetrics.leading; fontMetrics.ascent; fontMetrics.baseLine; fontMetrics.descent; fontMetrics.top; fontMetrics.bottom;其中使用mPaint.getFontMetric()获取的是float类型,计算出来的值和系统真实测量绘制后的值是有误差,误差就在这里。
说下 IncludedFontPadding :
IncludedFontPadding = false;则会去除上下的空隙。
计算公式:
IncludedFontPadding=false: height1=Descent - Ascent;(Ascent为负数)
IncludedFontPadding =true: height2=bottom - top;
结果:height2>height1; 就是有了多余的空白间距。
TextView中部分参数和手机系统部分参数的关系
scaledTextSize : Sp
textSize : PX
手机系统设置显示文字大小,变更的是Activity的Resource的配置信息fontScale,并非scaleDensity,请注意!不过scaleDensity也会跟随fontScale的变更而变化,计算公式可以看下方截图。
| 系统设置的显示文字大小 | 标准 | 大 | 超大 | 特大 |
|---|---|---|---|---|
| fontScale= | 1 | 1.15 | 1.3 | 1.45 |
举例:
android : textsize ="10sp"
在手机设置为特大时,
scaledTextSize = 10*1.45 = 14.5sp;
scaleDensity = fontScaledensity = 1.452=2.9;
textSize = 10*scaleDensity = 29px;(假如设备的scaleDensity =2)
固定文字大小:
通过上述,咱们想设定textview不随系统显示文字大小变更,可以设置size为dp值。
android:textsize="10dp",dp则不会进行scaleDensity换算,而是直接通过density换算(如下方截图),所以即使手机系统文字显示多大,textSize都是20px。
动态变更Resource的fontScale
通过此设定fontScale,可以变更界面的文字大小,无论你想要多大(最近在开发适老化,给老人家用的,当然字体要超级无穷大了)。
Resources resources = activity.getResources();
if(resources != null && resources.getConfiguration().fontScale != fontScale) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = fontScale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}