Multiple TypeFace in single TextView

前端 未结 2 1620
深忆病人
深忆病人 2020-11-29 18:31

I want to set the first character on TextView with a TypeFace and the second character with a different Type face and so on.
I read this exampl

2条回答
  •  感动是毒
    2020-11-29 19:11

    Kotlin developers can use this to use two or more typeface for single button or textview.

    1. Copy and Paste this class:

    class CustomTypefaceSpan(family: String?, private val newType: Typeface) : TypefaceSpan(family) {
    
        override fun updateDrawState(ds: TextPaint) {
            applyCustomTypeFace(ds, newType)
        }
    
        override fun updateMeasureState(paint: TextPaint) {
            applyCustomTypeFace(paint, newType)
        }
    
        companion object {
            private fun applyCustomTypeFace(paint: Paint, tf: Typeface) {
                val oldStyle: Int
                val old = paint.typeface
                oldStyle = old?.style ?: 0
                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
            }
        }
    }
    

    2. Using this by:

    val buttonText = "Get it for 100 Points"
    
    //making text yellow
        buttonText.setSpan(
            ForegroundColorSpan(
                ContextCompat.getColor(
                    this, R.color.yellow_FFC001
                )
            ),
            11, 14,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    
    //changing text size of yellow portion i.e. "100"
        val sp20 = resources.getDimensionPixelSize(R.dimen.sp_20)
        buttonText.setSpan(AbsoluteSizeSpan(sp20), 11, 14, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
    
    //setting button fonts
        buttonText.setSpan(
            CustomTypefaceSpan("", ResourcesCompat.getFont(this, R.font.roboto_condensed_bold)!!),
            0,
            buttonText.length,
            0
        )
    
    //finally setting this text to my button
    btGetPoints.text = buttonText
    

    3. And the final output would be like this

提交回复
热议问题