Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple TypeFace in single TextView

Tags:

java

android

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 example:

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

but it didn't help me, because I want to set multiple TypeFace (external TTFs)
Any idea??

like image 344
JustMe Avatar asked May 20 '12 16:05

JustMe


2 Answers

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

like image 146
Imran Rana Avatar answered Sep 21 '22 04:09

Imran Rana


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

enter image description here

like image 44
Kishan Solanki Avatar answered Sep 20 '22 04:09

Kishan Solanki