Android 文字的测量
private fun test1() {
textView.post {
val textWidth = textView.measuredWidth
val textHeight = textView.measuredHeight
Log.e(TAG, "方式一:$textWidth $textHeight") //方式一:255 63
}
}
private fun test2() {
val textSize = textView.textSize
val text = textView.text.toString()
val paint = Paint().apply {
this.textSize = textSize
}
val textWidth = paint.measureText(text)
Log.e(TAG, "方式二:$textWidth") //方式二:255.0
}
private fun test3() {
val textSize = textView.textSize
val text = textView.text.toString()
val rect = Rect()
val paint = Paint().apply {
this.textSize = textSize
getTextBounds(text, 0, text.length, rect)
}
val textWidth = rect.width()
val textHeight = rect.height()
Log.e(TAG, "方式三:$textWidth $textHeight") //方式三:249 37
}
private fun test4() {
val textSize = textView.textSize
val text = textView.text.toString()
var textWidth = 0F
val cWidths = FloatArray(text.length)
val paint = Paint().apply {
this.textSize = textSize
getTextWidths(text, cWidths)
}
cWidths.forEach {
textWidth += it
}
Log.e(TAG, "方式四:$textWidth") //方式四:254.28516
}
getTextBounds()
与measureText()
的区别
通过观察运行的结果,发现使用measureText()
测量的值比getTextBounds()
的值要大一些。
measureText()
:它测量的是文字绘制时所占用的宽度,每个文字之间都会有一定的间距,所以实际占用会更宽一点。getTextBounds()
:它测量的是文字的显示范围,是一个矩形区域,这个矩形区域尽可能的缩小,直到恰好紧紧包裹文字,这个矩形的范围就是这段文字的bounds。