想要计算下在一个TextView中最多能打印多少字符,但是理论计算结果和实际结果却不一致。
先说下我的算法:
获取屏幕的分辨率(px): width * height
获取屏幕密度: density
设置字体大小(sp): textSize
设置单倍行距(sp): SingleLineSpace
那么字体的行数(含行距)应该为: height / density / textSize = line
对于我的手机,分辨率为720 * 1280, 密度为2.0, 字体大小为20sp,单倍行距为20sp,那么理论结果是16行(含行距)。可是实际结果却是14.5行左右,明显后面几行被截掉了。
思考了一天多,也到好多论坛和群里去问,基本没人理啊,泪流满面。最后终于弄明白了,具体原因如下:
在多倍行距为0时,显示的字体大小就是设置的textSize,也就是说当把lineSpacingMultiplier设置为0时,显示的结果和计算的结果是一致的。但是当lineSpacingMultiplier大于0时,对于字体大小使用的不是设置的textSize。例如,设置textSize为20sp,使用函数getTextBounds可以获取字体的最小Rect,能够发现字高为37px,若单倍行距为20sp,多倍行距为1.0,那么实际的行高(包括行距)为87!也就是说,此时使用的字体大小是真实字高,而不是设置的textSize。
其实,只要使用TextView.getLineHeight()就能获得真实行高了...我辛辛苦苦研究了快一天,就是在找这个API啊...
相关代码:
获取字体的实际大小(最小包围盒)
TextPaint paint;
paint = ((TextView)findViewById(R.id.content)).getPaint();
paint.getTextBounds(C, 0, 1, bounds);
获取行高
int l = textView.getLineHeight();