Quiero establecer el primer carácter en TextView con un TypeFace y el segundo personaje con un diferente Tipo de letra y así sucesivamente.

He leído este ejemplo:

Spannable str = (Spannable) textView.getText();
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7  
                             ,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

pero no me ayuda, porque quiero establecer múltiples TypeFace (external TTFs)

Alguna idea??

  • Decir que hay dos tipos de letra como Typeface font = Typeface.createFromAsset(getAssets(), "1.ttf"); Typeface font2 = Typeface.createFromAsset(getAssets(), "2.ttf"); entonces, SpannableStringBuilder SS = new SpannableStringBuilder("your_text"); SS.setSpan ( new StyleSpan(font2.getStyle()), 0, 2,Spanned.SPAN_EXCLUSIVE_INCLUSIVE); SS.setSpan ( new StyleSpan(font.getStyle()), 3, 6,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);. ¿Has probado este enfoque?
  • Lo he probado, pero no funciona, creo que font1 de forma.getStyle() obtener el estilo de fuente que no es la fuente en sí
  • Tengo la solución a tu problema, echa un vistazo a mi respuesta :).
  • Rana: muchas Gracias
InformationsquelleAutor JustMe | 2012-05-20

1 Comentario

  1. 112

    Utilice el siguiente código:(yo estoy usando Bangla y Tamil fuente)

      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);

    El resultado es:

    Múltiples tipos de Letra en una sola TextView


    Para ello se utiliza el CustomTypefaceSpan clase, tomado de ¿Cómo puedo utilizar TypefaceSpan o StyleSpan con una Letra personalizada?:


    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);
    }
    }

    • Vale la pena precisar que este código no funciona si usted tiene android:textAllCaps="true" en su diseño.
    • Amigo, gracias.. ¿cómo se enteró de esto?
    • Gracias. Y proudfull eres un Bengalí 😏.
    • sólo en Android < 7 😀

Dejar respuesta

Please enter your comment!
Please enter your name here