【问题标题】:Multiple TypeFace in single TextView单个 TextView 中的多个 TypeFace
【发布时间】:2012-05-20 16:15:48
【问题描述】:

我想将TextView 上的第一个字符设置为TypeFace,将第二个字符设置为不同的Type face,依此类推。
我读了这个例子:

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

但这对我没有帮助,因为我想设置多个TypeFace (external TTFs)
有什么想法吗??

【问题讨论】:

  • 假设你有两个字体,比如Typeface font = Typeface.createFromAsset(getAssets(), "1.ttf"); Typeface font2 = Typeface.createFromAsset(getAssets(), "2.ttf");,那么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);。你试过这种方法吗?
  • 我试过了,但没用,我认为 font1.getStyle() 获取的是字体的样式而不是字体本身
  • 我找到了你的问题的解决方案,看看我的回答:)。

标签: java android


【解决方案1】:

使用以下代码:(我使用的是孟加拉语和泰米尔语字体)

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

结果是:


这使用了CustomTypefaceSpan 类,取自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);
}
}

【讨论】:

  • 值得指出的是,如果您的布局中有android:textAllCaps="true",则此代码不起作用。
【解决方案2】:

Kotlin 开发人员可以使用它为单个按钮或文本视图使用两种或多种字体。

1.复制并粘贴此类:

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。通过以下方式使用:

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.最终的输出是这样的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2021-01-27
    • 2018-07-27
    相关资源
    最近更新 更多