Xamarin Android несколько шрифтов в одном текстовом представлении - PullRequest
0 голосов
/ 09 июня 2018

Я использую Xamarin для приложения для Android, и у меня есть пользовательский TypeFace, созданный следующим образом:

Typeface weatherFont = Typeface.CreateFromAsset(Assets, "Weather.ttf");

Моя проблема в том, что у меня есть string, который должен быть назначен наTextView и мне нужно установить шрифт первых 3 символов на шрифт android по умолчанию, а остальные на мою weatherFont гарнитуру.Как я могу это сделать?

1 Ответ

0 голосов
/ 09 июня 2018

До API-27 вам нужен собственный подкласс CharacterStyle для применения пользовательского Typeface к Spannable.

Пример:

var sushiFont = Typeface.CreateFromAsset(Assets, "Tastysushi.ttf");
var spannable = new SpannableString("123 = SushiHangover");
spannable.SetSpan (new CustomTypefaceSpan(sushiFont), 3, spannable.Length(), SpanTypes.ExclusiveInclusive);
button.SetText(spannable, TextView.BufferType.Spannable);

Или в API-21 (+), вы можете избежать SetSpan индексации начала / конца символа, используя SpannableStringBuilder.Append:

var sushiFont = Typeface.CreateFromAsset(Assets, "Tastysushi.ttf");
var spannableString = new SpannableStringBuilder("123");
var spannable = new SpannableString(" = SushiHangover");
spannableString.Append(spannable, new CustomTypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);
button.SetText(spannableString, TextView.BufferType.Spannable);

А в API-28 + вы можете напрямую создавать диапазоны, которые напрямую включают другойTypeface без использования подкласса CharacterStyle:

spannableString.Append(spannable, new TypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);

CustomTypefaceSpan class

public class CustomTypefaceSpan : MetricAffectingSpan
{
    readonly Typeface typeFace;

    public CustomTypefaceSpan(Typeface typeFace)
    {
        this.typeFace = typeFace;
    }

    public override void UpdateDrawState(TextPaint tp)
    {
        tp.SetTypeface(typeFace);
    }

    public override void UpdateMeasureState(TextPaint p)
    {
        p.SetTypeface(typeFace);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...