单TextView中多字体 [英] Multiple TypeFace in single TextView

查看:137
本文介绍了单TextView中多字体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想设置的TextView 的第一个字符用字体,第二个字符与不同类型的脸等等。
我读到这个例子:

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

但它并不能帮助我,因为我要设置多个字体(外部专题信托基金)
任何想法??

解决方案

使用下列code:(我用孟加拉语和泰米尔语字体)

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


的结果是:


CustomTypefaceSpan类:

 包my.app;
进口android.graphics.Paint;
进口android.graphics.Typeface;
进口android.text.TextPaint;
进口android.text.style.TypefaceSpan;

公共类CustomTypefaceSpan扩展TypefaceSpan {

私人最终字样NEWTYPE;

公共CustomTypefaceSpan(字符串的家庭,字体类型){
    超(家庭);
    NEWTYPE =类型;
}

@覆盖
公共无效updateDrawState(TextPaint DS){
    applyCustomTypeFace(DS,NEWTYPE);
}

@覆盖
公共无效updateMeasureState(TextPaint漆){
    applyCustomTypeFace(油漆,NEWTYPE);
}

私有静态无效applyCustomTypeFace(油漆涂料,字体TF){
    INT旧式;
    字样旧= paint.getTypeface();
    如果(旧== NULL){
        旧式= 0;
    } 其他 {
        旧式= old.getStyle();
    }

    INT假=旧式和放大器; 〜tf.getStyle();
    如果((假&安培;!Typeface.BOLD)= 0){
        paint.setFakeBoldText(真正的);
    }

    如果((假&安培;!Typeface.ITALIC)= 0){
        paint.setTextSkewX(-0.25f);
    }

    paint.setTypeface(TF);
}
}
 


<一个href="http://stackoverflow.com/questions/4819049/how-can-i-use-typefacespan-or-stylespan-with-custom-typeface">Reference

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??

解决方案

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:


CustomTypefaceSpan Class:

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


Reference

这篇关于单TextView中多字体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆