XAMARIN:跨平台FontFamily

时间:2015-09-23 06:22:37

标签: android fonts xamarin

我需要在我的应用中为不同的标签指定不同的FontFamily。我需要使用默认字体(例如Android的Roboto和iOS的Helvetica)及其修改(例如Light,Medium,Bold)。据我所知,我应该使用Roboto-Light和Helvetica-Light来获得Light版本的字体(同样适用于Medium和Bold)。 除了这个要求,我需要在XAML中设置字体(如described in documentation),所以我最终得到这个代码

<StackLayout BackgroundColor="#F8F8F8" Padding="0, 20, 0, 0">
<Label Text="Black" TextColor="#000000" >
  <Label.FontSize>
    <OnPlatform x:TypeArguments="x:Double"
                iOS="17"
                Android="16"
                WinPhone="16" />
  </Label.FontSize>
  <Label.FontFamily>
    <OnPlatform x:TypeArguments="x:String">
      <OnPlatform.iOS>Helvetica-Black</OnPlatform.iOS>
      <OnPlatform.Android>Roboto-Black</OnPlatform.Android>
      <OnPlatform.WinPhone></OnPlatform.WinPhone>
    </OnPlatform>
  </Label.FontFamily>
</Label>
<Label Text="Light" TextColor="#000000">
  <Label.FontSize>
    <OnPlatform x:TypeArguments="x:Double"
                iOS="17"
                Android="16"
                WinPhone="16" />
  </Label.FontSize>
  <Label.FontFamily>
    <OnPlatform x:TypeArguments="x:String">
      <OnPlatform.iOS>Helvetica-Light</OnPlatform.iOS>
      <OnPlatform.Android>Roboto-Light</OnPlatform.Android>
      <OnPlatform.WinPhone></OnPlatform.WinPhone>
    </OnPlatform>
  </Label.FontFamily>
</Label>
<Label Text="Medium" TextColor="#000000" >
  <Label.FontSize>
    <OnPlatform x:TypeArguments="x:Double"
                iOS="17"
                Android="16"
                WinPhone="16" />
  </Label.FontSize>
  <Label.FontFamily>
    <OnPlatform x:TypeArguments="x:String">
      <OnPlatform.iOS>Helvetica-Medium</OnPlatform.iOS>
      <OnPlatform.Android>Roboto-Medium</OnPlatform.Android>
      <OnPlatform.WinPhone></OnPlatform.WinPhone>
    </OnPlatform>
  </Label.FontFamily>
</Label>
<Label Text="Bold"  TextColor="#000000">
  <Label.FontSize>
    <OnPlatform x:TypeArguments="x:Double"
                iOS="17"
                Android="16"
                WinPhone="16" />
  </Label.FontSize>
  <Label.FontFamily>
    <OnPlatform x:TypeArguments="x:String">
      <OnPlatform.iOS>Helvetica-Bold</OnPlatform.iOS>
      <OnPlatform.Android>Roboto-Bold</OnPlatform.Android>
      <OnPlatform.WinPhone></OnPlatform.WinPhone>
    </OnPlatform>
  </Label.FontFamily>
</Label>

但是,Android中的结果是出乎意料的。不同标签的FontFamily不会更改。它们看起来都一样。

Android

iOS中的相同代码按预期工作

enter image description here

我的问题是:如果关注我的Android应用中如何获得 Roboto-Light Roboto-Medium Roboto-Bold 字体XAMARIN文档不起作用?

4 个答案:

答案 0 :(得分:4)

更新:

我没有看到你第一次使用API​​ 18 / 4.3(在模拟器的标题栏中),以为你是将它们作为旧版Android版本的自定义资源加载。由于roboto是4.1以来的默认字体,因此您可以将它们用作:

  • 无衬线
  • sans-serif-light
  • 无衬线缩合
  • sans-serif-thin(4.2 +)

原件:

https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/fonts/

  

Android版Xamarin.Forms目前尚未公开设置功能   自定义字体文件的字体,因此需要自定义渲染器。什么时候   为Android平台编写渲染器,创建一个Typeface   引用已添加到的自定义字体文件的实例   应用程序的Assets目录(使用Build Action:AndroidAsset)。

[assembly: ExportRenderer (typeof (MyLabel), typeof (MyLabelRenderer))]
namespace WorkingWithFonts.Android {
    public class MyLabelRenderer : LabelRenderer {
        protected override void OnElementChanged (ElementChangedEventArgs<Label> e) {
            base.OnElementChanged (e);
            var label = (TextView)Control; // for example
            Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "SF Hollywood Hills.ttf");
            label.Typeface = font;
        }
    }
}

答案 1 :(得分:1)

我为我需要的所有视图覆盖了默认的渲染器。

通过这种方式,您可以按照以下方式使用XAML代码:

<Label FontFamily="Arial" Text="Hi there" />

以下是Label的示例。

[assembly: ExportRenderer (typeof (Label), typeof (MyLabelRenderer))]
namespace MyApp.Droid
{
    public class MyLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if ( !String.IsNullOrEmpty(Element.FontFamily) )
                Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily + ".otf");
        }
    }
}

当然,您需要将其映射到嵌入自定义字体的位置。在我的情况下资产/字体/ Arial.otf

答案 2 :(得分:0)

请使用下面的渲染,在标签中加载自定义字体,请确保将您的字体文件放在android项目资源文件夹的fonts文件夹中,为所有平台定义类似的路径

[assembly: ExportRenderer(typeof(Label), typeof(CustomLabelRenderer))]
namespace MyApp.Droid.Renderer
{
    public class CustomLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
                if (!String.IsNullOrEmpty(e.NewElement.FontFamily))
                    Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily);
        }
    }
}

标签控件的xaml,请确保字体文件夹中有字体文件

<Label FontFamily="Roboto-Light.ttf" Text="Hi there" />

答案 3 :(得分:0)

截至2018年,在Xamairn.Forms中,不再需要平台渲染器。步骤是:

  1. 下载TTF文件并将其作为资源捆绑到每个平台项目中
  2. 请参考Xamarin.Forms共享项目中的字体,并考虑到每个平台的特殊性(寻址资源和字体家族的命名约定)。
  3. 将字体应用于Xamarin.Forms控件。

Here's detailed description,介绍如何在macOS,WPF和Android中添加和应用自定义字体。