Android TextView设置Ellipsize后省略号偏移,如何调整至文本底部?
解决TextView省略号位置偏高的问题
这个问题我之前在使用自定义字体时也碰到过,大概率是字体基线偏移、TextView垂直对齐设置不当,或者系统默认省略号与自定义字体不兼容导致的。咱们可以从这几个方向尝试解决:
1. 调整TextView的垂直对齐与行高(最常用解法)
先给TextView设置合适的垂直对齐方式,去掉字体自带的多余内边距,再搭配匹配的行高,让文本和省略号在同一基线对齐。
修改样式文件
直接在ToolbarTextViewAppearance里新增这几个属性:
<style name="ToolbarTextViewAppearance" parent="@android:style/TextAppearance"> <item name="android:textColor">@color/white</item> <item name="android:textSize">@dimen/text_size_large</item> <item name="android:fontFamily">@font/noto_sans_bold</item> <!-- 新增对齐与行高配置 --> <item name="android:gravity">center_vertical|start</item> <!-- 让文本垂直居中对齐 --> <item name="android:includeFontPadding">false</item> <!-- 去掉字体自带的上下冗余内边距 --> <item name="android:lineHeight">@dimen/line_height_large</item> <!-- 行高建议设为字体大小+4~6sp,比如text_size_large是18sp的话,line_height设为24sp --> </style>
或者在代码中动态配置
如果不方便修改样式,也可以在代码里直接设置:
(titleView as TextView?)?.let { it.text = title it.ellipsize = TextUtils.TruncateAt.END it.maxLines = 1 // 新增对齐与内边距配置 it.gravity = Gravity.CENTER_VERTICAL or Gravity.START it.includeFontPadding = false it.setLineHeight(context.resources.getDimensionPixelSize(R.dimen.line_height_large)) }
2. 修复自定义字体的基线问题
如果上面的方法无效,可能是你用的noto_sans_bold字体本身的基线定义有问题。可以尝试:
- 换用官方原版的Noto Sans字体,确保字体文件未被修改
- 用字体编辑工具(比如FontForge)调整字体的基线位置,让字体自带的省略号与正文对齐
3. 手动实现Ellipsize效果(终极方案)
如果系统自带的ellipsize始终有兼容性问题,咱们可以手动截取文本并添加省略号,确保省略号和正文用同一个字体,完全对齐:
(titleView as TextView?)?.let { tv -> val titleText = title ?: "" // 计算TextView可容纳文本的最大宽度(减去内边距) val maxAvailableWidth = tv.width - tv.paddingStart - tv.paddingEnd val paint = tv.paint // 预留省略号的宽度 val ellipsisWidth = paint.measureText("...") val maxTextWidth = maxAvailableWidth - ellipsisWidth if (paint.measureText(titleText) > maxAvailableWidth) { // 截取能容纳的文本长度,手动拼接省略号 val truncatedLength = paint.breakText(titleText, true, maxTextWidth, null) tv.text = titleText.substring(0, truncatedLength) + "..." } else { tv.text = titleText } tv.maxLines = 1 }
注意:这个方法需要确保TextView已经完成布局测量(比如在onLayout生命周期回调中调用,或者用ViewTreeObserver监听布局完成),否则tv.width会返回0。
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

