Multiple TypeFace in single TextView

前端 未结 2 1617
深忆病人
深忆病人 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

    0 讨论(0)
  • 2020-11-29 19:15

    Use the following code:(I'm using Bangla and Tamil font)

      TextView txt = (TextView) findViewById(R.id.custom_fonts);  
            txt.setTextSize(30);
            Typeface font = Typeface.createFromAsset(getAssets(), "Akshar.ttf");
            Typeface font2 = Typeface.createFromAsset(getAssets(), "bangla.ttf");   
            SpannableStringBuilder SS = new SpannableStringBuilder("আমারநல்வரவு");
            SS.setSpan (new CustomTypefaceSpan("", font2), 0, 4,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            SS.setSpan (new CustomTypefaceSpan("", font), 4, 11,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            txt.setText(SS);
    

    The outcome is:

    enter image description here


    This uses the CustomTypefaceSpan class, taken from How can I use TypefaceSpan or StyleSpan with a custom Typeface?:


    package my.app;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.text.TextPaint;
    import android.text.style.TypefaceSpan;
    
    public class CustomTypefaceSpan extends TypefaceSpan {
    
    private final Typeface newType;
    
    public CustomTypefaceSpan(String family, Typeface type) {
        super(family);
        newType = type;
    }
    
    @Override
    public void updateDrawState(TextPaint ds) {
        applyCustomTypeFace(ds, newType);
    }
    
    @Override
    public void updateMeasureState(TextPaint paint) {
        applyCustomTypeFace(paint, newType);
    }
    
    private static void applyCustomTypeFace(Paint paint, Typeface tf) {
        int oldStyle;
        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }
    
        int fake = oldStyle & ~tf.getStyle();
        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }
    
        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }
    
        paint.setTypeface(tf);
    }
    }
    

    0 讨论(0)
提交回复
热议问题