如何计算EditText无需水平滚动可容纳的字符数或总文本宽度
解决方案
问题2:如何获取包含超出显示区域字符的EditText总文本宽度
直接使用EditText自带的Paint对象测量即可,该Paint已经包含了当前控件配置的字号、字体、字间距等所有绘制属性,测量结果和实际显示宽度完全一致,单位为像素:
val totalTextWidth = edtResult.paint.measureText(edtResult.text.toString())
问题1:当前textSize下,计算无需水平滚动即可在EditText中容纳的字符数量
首先需要先拿到EditText的可用文本宽度(要扣除左右内边距),再使用Paint的breakText方法直接计算可容纳的最大字符数:
// 计算控件可用宽度(扣除内边距) val availableWidth = edtResult.width - edtResult.paddingLeft - edtResult.paddingRight // 计算最多可容纳的字符数 val maxFitCharCount = edtResult.paint.breakText( edtResult.text.toString(), true, // 测量方向:从文本开头计算 availableWidth.toFloat(), null // 不需要返回测量宽度的话传null即可 )
自动适配字号的完整实现示例
如果你的核心需求是让文本自动缩小字号适配控件宽度、无需滚动,可以直接参考如下实现:
// 可自行调整参数 private val MAX_TEXT_SIZE_SP = 22f private val MIN_TEXT_SIZE_SP = 12f private fun adjustTextSizeForEditText() { val availableWidth = edtResult.width - edtResult.paddingLeft - edtResult.paddingRight // 控件未完成布局、文本为空时跳过,后续再触发 if (availableWidth <= 0 || edtResult.text.isEmpty()) return var currentSizeSp = MAX_TEXT_SIZE_SP val textContent = edtResult.text.toString() while (currentSizeSp >= MIN_TEXT_SIZE_SP) { edtResult.textSize = currentSizeSp val currentTotalWidth = edtResult.paint.measureText(textContent) if (currentTotalWidth <= availableWidth) { break } currentSizeSp -= 1f } }
你可以在TextWatcher的afterTextChanged回调、控件的OnLayoutChangeListener回调中调用该方法,保证文本变化、控件尺寸变化时都能自动适配。
内容的提问来源于stack exchange,提问作者user17388549
相关产品推荐
相关产品推荐

