Measuring text width to be drawn on Canvas ( Android )

前端 未结 7 1821
轮回少年
轮回少年 2020-12-12 16:18

Is there a method which returns the width ( in pixels ) of a text to be drawn on an Android canvas using the drawText() method according to the Paint used to draw it?

7条回答
  •  一生所求
    2020-12-12 16:35

    There's actually three different ways of measuring text.

    GetTextBounds:

    val paint = Paint()
    paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
    paint.textSize = 500f
    paint.color = Color.argb(255, 3, 221, 252)
    val contents = "g"
    val rect = Rect()
    paint.getTextBounds(contents, 0, 1, rect)
    val width = rect.width()
    

    MeasureTextWidth:

    val paint = Paint()
    paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
    paint.textSize = 500f
    paint.color = Color.argb(255, 3, 221, 252)
    val contents = "g"
    val width = paint.measureText(contents, 0, 1)
    

    And getTextWidths:

    val paint = Paint()
    paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
    paint.textSize = 500f
    paint.color = Color.argb(255, 3, 221, 252)
    val contents = "g"
    val rect = Rect()
    val arry = FloatArray(contents.length)
    paint.getTextBounds(contents, 0, contents.length, rect)
    paint.getTextWidths(contents, 0, contents.length, arry)
    val width = ary.sum()
    

    Note that getTextWidths could be useful if you are trying to determine when to wrap text to the next line.

    The measureTextWidth and getTextWidth are equal and have the advanced width that measure that others have posted about. Some consider this space excessive. However, this is very subjective and dependent on the font.

    For example the width from measure text bounds may actually look too small:

    measure text bounds looks small

    However when adding an additional text the bounds for one letter looks normal: measure text bounds looks normal for strings

    Images taken from Android Developers Guide to Custom Canvas Drawing

提交回复
热议问题