将两种不同的字体样式应用于TextView

时间:2012-03-08 14:03:22

标签: android fonts styles textview

我想在单个TextView中对文本应用两种不同的字体样式。

我的情况与Android - two sentences, two styles, one TextView相同。唯一的区别是我想在整个文本上设置自定义字体。我已将Helvetica Font作为资产包含在我的项目中,并希望将该字体应用于TextView,文本的第一部分将是Helvetica BOLD,其余部分为Helvetica NORMAL。有什么建议可以吗?

以下格式需要文字。具有不同样式和单一文本视图的自定义文本。

enter image description here

6 个答案:

答案 0 :(得分:74)

执行此操作的一种方法是扩展TypefaceSpan

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

然后当你想使用两种不同的字体时调用:

String firstWord = "first ";
String secondWord = "second";

// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+secondWord);

// Set the custom typeface to span over a section of the spannable object
spannable.setSpan( new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the text of a textView with the spannable object
textView.setText( spannable );

答案 1 :(得分:3)

这是一个更直接的解决方案,您可以使用HTML在同一TextView上设置不同的样式。

例如:

// Styled label
String styledText = "<big><b><font color='#333333'>title</font></b></big> <small><b><font color='#CC5490'>subtitle</font></b></small>";

// Apply the styled label on the TextView
textView.setText(Html.fromHtml(styledText));

您需要以下导入:

import android.text.Html;

答案 2 :(得分:2)

这可能有效 - 创建自己的自定义TextView,然后在其中的一部分上使用StyleSpan:

public class CustomTextView extends TextView {

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setTypeface(Typeface tf, int style) {
        if (style == 1){
            //replace "HelveticaBOLD.otf" with the name of your bold font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf");
        }else{
            //replace "HelveticaNORMAL.otf" with the name of your normal font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf");
        }
        super.setTypeface(tf, 0);
    }
}

然后你可以这样做:

int index1 = 0; //wherever bold should begin
int index2 = 5; //wherever bold should end

Spannable span = new SpannableString("some string");
span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

((CustomTextView)findViewById(R.id.yourTextView)).setText(span);

答案 3 :(得分:0)

您可以使用 canvas.drawText 方法

创建自定义视图并使用两个画图对象渲染文本

答案 4 :(得分:0)

TypefaceSpan- 例如,让我们考虑一个具有android:textStyle =“ italic”的TextView和一个基于资源中的字体以粗体样式创建的字体。当应用基于字体的TypefaceSpan时,文本将仅保留粗体样式,覆盖TextView的textStyle。当基于字体家族“等宽字体”应用TypefaceSpan时,结果文本将保持斜体样式。

https://developer.android.com/reference/android/text/style/TypefaceSpan

答案 5 :(得分:-2)

在应用可翻转文本之前,您是否尝试在TextView上设置自定义字体?

Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf")
TextView tv = (TextView) ctx.findViewById(id);
tv.setTypeface(face);

然后从链接的问题中应用SpannableStringBuilder - 我只假设如果你的ttf支持'normal'和'bold',它会相应地呈现:)