web-dev-qa-db-ja.com

TextViewに2つの異なるフォントスタイルを適用する

1つのTextViewのテキストに2つの異なるフォントスタイルを適用したい。

私の場合は Android-2つの文、2つのスタイル、1つのTextView と同じです。唯一の違いは、テキスト全体にカスタムフォントを設定することです。 Helveticaフォントをプロジェクトにアセットとして含め、そのフォントをTextViewに適用したいのですが、テキストの最初の部分はHelvetica BOLDで、残りの部分はHelvetica NORMALになります。どのようにそれを行うことができますか?

次の形式のテキストが必要です。さまざまなスタイルと単一のテキストビューを持つカスタムテキスト。

enter image description here

28
rizzz86

これを行う1つの方法は、拡張することです 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);
        }
    }

次に、2つの異なる書体を使用する場合は、次のように呼び出します。

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

これがより簡単な解決策です。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;
3
Yoann Hercouet

これはうまくいくかもしれません-独自のカスタム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);
2
Sam Dozor

カスタムビューを作成し、2つのPaintオブジェクトを使用してテキストをレンダリングできますcanvas.drawTextメソッドを使用します

0
Mina Samy

TypefaceSpan-たとえば、Android:textStyle = "italic"が設定されたTextViewと、リソースのフォントに基づいて作成された太字スタイルの書体を考えてみましょう。 TypefaceSpanに基づいたタイプフェイスを適用すると、テキストはボールドスタイルのみを保持し、TextViewのtextStyleをオーバーライドします。フォントファミリ「モノスペース」に基づいてTypefaceSpanを適用すると、結果のテキストはイタリックスタイルを維持します。

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

0
Solanki Kamlesh