【发布时间】:2016-09-17 15:09:14
【问题描述】:
我想了解 textView 最终高度的实际计算方式。
我尝试了以下方法测量 TextView 的高度。
public static int getHeight(Context context, String text, int textSize, int deviceWidth) {
EmojiTextView textView = new EmojiTextView(context);
textView.setText(text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
textView.measure(widthMeasureSpec, heightMeasureSpec);
float lineSpacingMulti = textView.getLineSpacingMultiplier();
float lineSpacingExtra = textView.getLineSpacingExtra();
float lineHeight = textView.getLineHeight();
Log.d(TAG, "getHeight: lineSpacingMulti" + lineSpacingMulti + ":lineSpacingExtra:" + lineSpacingExtra + ":lineHeight:" + lineHeight);
return textView.getMeasuredHeight();
}
我得到了以下 logcat 结果:
09-17 12:11:18.974 25729-25729/?: getHeight: lineSpacingMulti1.0:lineSpacingExtra:0.0:lineHeight:43.0
09-17 12:11:18.973 25729-25729/?: calculateDynamicTextSize: ME Height 58
所以如果行高为43且行距乘数为1,那么为什么测量文本的高度为58?
【问题讨论】:
-
如果你真的想知道看
TextView#onMeasure方法,但你实际上需要它做什么? -
@pskink 我正在测量文本的顶部和底部填充。因此,如果我在 LinearLayout 中放置两个 textView 或一个 textView 和一个 ImageView,它们之间的空间应该看起来相同。
-
参见
TextView#setIncludeFontPadding,但为什么不使用一个TextView而不是在LinearLayout中合并两个或多个? -
@pskink setIncludeFontPadding 没有价值,或者我可以说它对某些字体的效果更差。我必须支持所有系统字体。两个TextView 只是一个例子。它可以是任何数字。
-
使用this布局并注意正确的文本:它看起来像一个
TextView,但实际上它们是三个TextViews合一LinearLayout