C# Xamarin Android在同一文本视图中使用多种字体

C# Xamarin Android在同一文本视图中使用多种字体,c#,android,xamarin,fonts,xamarin.android,C#,Android,Xamarin,Fonts,Xamarin.android,我将Xamarin用于Android应用程序,我创建了一个自定义的字体,如下所示: Typeface weatherFont = Typeface.CreateFromAsset(Assets, "Weather.ttf"); 我的问题是我有一个字符串,必须分配给文本视图,我需要将前3个字符的字体设置为默认的android字体,其余的设置为我的weatherFont字体。如何才能做到这一点?在API-27之前,您需要一个自定义的字符样式子类来将自定义的字体应用于可扩展的 例子: 或者在API-

我将Xamarin用于Android应用程序,我创建了一个自定义的
字体
,如下所示:

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

我的问题是我有一个
字符串
,必须分配给
文本视图
,我需要将前3个字符的字体设置为默认的android字体,其余的设置为我的
weatherFont
字体。如何才能做到这一点?

在API-27之前,您需要一个自定义的
字符样式
子类来将自定义的
字体
应用于
可扩展的

例子: 或者在API-21(+)中,您可以通过使用
SpannableStringBuilder.Append
避免
SetSpan
字符开始/结束索引:

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+中,您可以直接创建跨距,直接包含不同的
字体
,而无需使用
字符样式
子类:

spannableString.Append(spannable, new TypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);
自定义字体跨度类
非常清楚和有用的解释!非常感谢你!
spannableString.Append(spannable, new TypefaceSpan(sushiFont), SpanTypes.ExclusiveInclusive);
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);
    }
}