Примените два разных стиля шрифта к TextView
Я хочу применить два разных стиля шрифта к тексту в одном TextView.
Мой случай такой же, как Android - два предложения, два стиля, один TextView. Единственное различие заключается в том, что я хочу настроить пользовательский шрифт на весь текст. Я включил Helvetica Font в качестве активов в моем проекте и хочу применить этот шрифт к TextView с первой частью текста будет Helvetica BOLD и оставшаяся часть Helvetica NORMAL. Любые предложения, как это можно сделать?
Текст необходим в следующем формате. Пользовательский текст с разными стилями и отдельным текстом.
![enter image description here]()
Ответы
Ответ 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);
}
}
Затем, когда вы хотите использовать два разных шрифта, вызовите:
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 );
Ответ 2
Вот решение, более простое, вы можете использовать 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
Это может сработать - создайте свой собственный 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);
Ответ 4
Вы можете создать собственное представление и сделать свой текст двумя объектами Paint, используя метод canvas.drawText
Ответ 5
Я использовал этот подход:
class FooClass {
void Foo() {
textViewSetText(R.id.photo_title, "Title: ", photo.getTitle());
textViewSetText(R.id.photo_tags, "Tags: ", photo.getTags());
textViewSetText(R.id.photo_author, "Author: ", photo.getAuthor());
}
private void textViewSetText(int resourceId, String prefix, String text) {
TextView textView = (TextView) findViewById(resourceId);
SpannableString styledText = new SpannableString(prefix);
styledText.setSpan(new StyleSpan(Typeface.BOLD), 0, prefix.length(), 0);
textView.setText(null);
textView.append(styledText);
textView.append(text);
}
}
Как вы можете видеть ниже, " Автор ", " Заголовок " и " Теги " установлены в полужирный:
![Screenshot Screenshot]()
Ответ 6
Пробовал ли вы настраивать пользовательский шрифт в TextView перед тем, как применить текст с возможностью использования spanable?
Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf")
TextView tv = (TextView) ctx.findViewById(id);
tv.setTypeface(face);
а затем примените SpannableStringBuilder как из связанного вопроса - я предполагаю, что если ваш ttf поддерживает "normal" и "bold", он будет соответственно отображать:)