首页 > 解决方案 > 根据文本边界将 TextView 放置在容器的中心

问题描述

我正在尝试以编程方式将 TextView 放置在其容器的中心,其中仅考虑文本边界,而不是整个 TextView rect。见下图:

在此处输入图像描述

我的代码:

// "workingLayout" is the container on the TextView
val tvv = TextView(this)
tvv.includeFontPadding = false
tvv.setPadding(20, 0, 20, 0)
tvv.gravity = Gravity.CENTER
tvv.text = "ggg"
tvv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 150f)
tvv.setTextColor(Color.BLUE)
tvv.background = resources.getDrawable(R.drawable.edit_text_shape, null)

tvv.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
tvv.x = (workingLayout.width / 2f) - (tvv.measuredWidth / 2)
tvv.y = (workingLayout.height / 2f) - (tvv.measuredHeight / 2)
workingLayout.addView(tvv)

我尝试使用paint.getTextBounds而不是measure但没有运气......

谢谢!

标签: androidandroid-layouttextview

解决方案


多亏了这篇文章,才得以完成。

基本上,paint.getTextBounds结果是相对于 TextViewbaseline和我们可以从中得到的 TextView 基线textView.baseline,假设我们可以计算文本边界框的中点,并从容器中点减去它(而不是 TextView 中点)。

参考图:

在此处输入图像描述

val tv = TextView(this)
// init TextView
...
...
tv.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)

// Get text bounding box
val bbox = Rect()
tv.paint.getTextBounds(tv.text.toString(), 0, tv.text.toString().length, bbox)

// The distance from textview top to actual text top
val textInsetTop = tv.baseline + bbox.top

// Text bounding box mid
val bboxMid = textInsetTop + (bbox.height() / 2f)

// Now can center the TextView in its container
val containerMid = workingLayout.height / 2f
tv.y = containerMid - bboxMid

重要提示:这仅适用于单行文本视图(且未缩放)。


推荐阅读