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??
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:
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); } }
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With