Строитель растягиваемых строк, не применяющий шрифт

#android #stringbuilder #spannablestring #spannablestringbuilder

Вопрос:

Я пытаюсь создать строку, к которой применены два разных пользовательских шрифта. Я добавил две строки с соответствующим шрифтом в конструктор строк, но это вообще ничего не делает со строкой? Кто-нибудь знает, почему?

 private fun createSpannedNameAndComment(name: String, comment: String): SpannableStringBuilder {

    val semiBoldFont = android.graphics.Typeface.create(
        ResourcesCompat.getFont(
            this,
            R.font.josefin_san_semi_bold
        ), android.graphics.Typeface.NORMAL
    )

    val regularFont = android.graphics.Typeface.create(
        ResourcesCompat.getFont(
            this,
            R.font.josefin_san_regular
        ), android.graphics.Typeface.NORMAL
    )

    return SpannableStringBuilder().apply {
        append(name, semiBoldFont, 0)
        append(" ")
        append(comment, regularFont, 0)
    }

}
 

Ответ №1:

Вы можете использовать этот пользовательский TypefaceSpan класс:

 class CustomTypefaceSpan constructor(type: Typeface) : TypefaceSpan("") {

    private var newType = type

    override fun updateDrawState(ds: TextPaint) {
        applyCustomTypeFace(ds, newType)
    }

    override fun updateMeasureState(paint: TextPaint) {
        applyCustomTypeFace(paint, newType)
    }

    private fun applyCustomTypeFace(paint: Paint, tf: Typeface?) {
        val old: Typeface = paint.typeface
        val oldStyle = old.style
        val fake = oldStyle and tf!!.style.inv()
        if (fake and Typeface.BOLD != 0) paint.isFakeBoldText = true
        if (fake and Typeface.ITALIC != 0) paint.textSkewX = -0.25f
        paint.typeface = tf
    }

}
 

И примените это к своему SpannableStringBuilder :

 private fun createSpannedNameAndComment(name: String, comment: String): SpannableStringBuilder {

    val semiBoldFont = android.graphics.Typeface.create(
        ResourcesCompat.getFont(
            this,
            R.font.josefin_san_semi_bold
        ), android.graphics.Typeface.NORMAL
    )

    val regularFont = android.graphics.Typeface.create(
        ResourcesCompat.getFont(
            this,
            R.font.josefin_san_regular
        ), android.graphics.Typeface.NORMAL
    )

    return SpannableStringBuilder().apply {
        append(name, CustomTypefaceSpan(semiBoldFont), 0)
        append(" ")
        append(comment, CustomTypefaceSpan(regularFont), 0)
    }

}