1つのTextViewのテキストに2つの異なるフォントスタイルを適用したい。
私の場合は Android-2つの文、2つのスタイル、1つのTextView と同じです。唯一の違いは、テキスト全体にカスタムフォントを設定することです。 Helveticaフォントをプロジェクトにアセットとして含め、そのフォントをTextViewに適用したいのですが、テキストの最初の部分はHelvetica BOLDで、残りの部分はHelvetica NORMALになります。どのようにそれを行うことができますか?
次の形式のテキストが必要です。さまざまなスタイルと単一のテキストビューを持つカスタムテキスト。
これを行う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 );
これがより簡単な解決策です。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;
これはうまくいくかもしれません-独自のカスタム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つのPaintオブジェクトを使用してテキストをレンダリングできますcanvas.drawTextメソッドを使用します
TypefaceSpan-たとえば、Android:textStyle = "italic"が設定されたTextViewと、リソースのフォントに基づいて作成された太字スタイルの書体を考えてみましょう。 TypefaceSpanに基づいたタイプフェイスを適用すると、テキストはボールドスタイルのみを保持し、TextViewのtextStyleをオーバーライドします。フォントファミリ「モノスペース」に基づいてTypefaceSpanを適用すると、結果のテキストはイタリックスタイルを維持します。
https://developer.Android.com/reference/Android/text/style/TypefaceSpan ?