android - 根据文本边界将 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
但没有运气......
谢谢!
解决方案
多亏了这篇文章,才得以完成。
基本上,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
重要提示:这仅适用于单行文本视图(且未缩放)。
推荐阅读
- influxdb - InfluxDB 无法选择字段键
- r - 无法从 R 中的数据框中绘制不同类型的变量
- react-native - 注意日历的变化,何时提出请求
- reactjs - React Router Link 回调函数
- python - 导入当前目录下的所有文件
- python - 我们有嵌套列表创建字典键作为单词列表以及它们作为值出现的次数
- jupyter-notebook - Ipywidget Accordion 默认行为
- python - Overpass 查询适用于 overpass-turbo.eu,但不适用于本地
- flutter - 如何在 Row 小部件中定位 CustomPaint?
- ios - 自动调整包含 UICollectionView 的 UITableViewCell