TextView的TextSize和height的关系

1,571 阅读1分钟

先上个图,可以通过Paint指定textSize获取到相关信息。

7a716d7fe17f407fb15f99f2490af213.png

通过代码获取相应的信息:

  1. 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=11.151.31.45

举例:

android : textsize ="10sp"

在手机设置为特大时,

scaledTextSize = 10*1.45 = 14.5sp;

scaleDensity = fontScaledensity = 1.452=2.9;

textSize = 10*scaleDensity = 29px;(假如设备的scaleDensity =2) image.png

固定文字大小:

通过上述,咱们想设定textview不随系统显示文字大小变更,可以设置size为dp值。

android:textsize="10dp",dp则不会进行scaleDensity换算,而是直接通过density换算(如下方截图),所以即使手机系统文字显示多大,textSize都是20px。

image.png

动态变更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());
 }

demo就后面再补了。