Condividi tramite


Tipi di carattere

Panoramica

A partire dal livello API 26, Android SDK consente di trattare i tipi di carattere come risorse, proprio come layout o disegnabili. La libreria di supporto Android 26 NuGet eseguirà il backporting della nuova API del tipo di carattere alle app destinate al livello API 14 o superiore.

Dopo aver usato l'API 26 o l'installazione della libreria di supporto Android v26, esistono due modi per usare i tipi di carattere in un'applicazione Android:

  1. Creare un pacchetto del tipo di carattere come risorsa Android. Ciò garantisce che il tipo di carattere sia sempre disponibile per l'applicazione, ma aumenterà le dimensioni dell'APK.
  2. Scarica i tipi di carattere : Android supporta anche il download di un tipo di carattere da un provider di tipi di carattere. Il provider di tipi di carattere controlla se il tipo di carattere è già presente nel dispositivo. Se necessario, il tipo di carattere verrà scaricato e memorizzato nella cache nel dispositivo. Questo tipo di carattere può essere condiviso tra più applicazioni.

Tipi di carattere simili (o un tipo di carattere con diversi stili) possono essere raggruppati in famiglie di caratteri. Ciò consente agli sviluppatori di specificare determinati attributi del tipo di carattere, ad esempio lo spessore, e Android selezionerà automaticamente il tipo di carattere appropriato dalla famiglia di caratteri.

La libreria di supporto Android v26 eseguirà il backport del supporto per i tipi di carattere al livello API 26. Quando si impostano come destinazione i livelli API precedenti, è necessario dichiarare lo app spazio dei nomi XML e denominare i vari attributi del tipo di carattere usando lo android: spazio dei nomi e lo app: spazio dei nomi. Se viene usato solo lo android: spazio dei nomi, i tipi di carattere non verranno visualizzati nei dispositivi che eseguono il livello API 25 o meno. Ad esempio, questo frammento XML dichiara una nuova risorsa della famiglia di caratteri che funzionerà nel livello API 14 e versioni successive:

<?xml version="1.0" encoding="utf-8"?>
<font-family
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

     <font  android:font="@font/sourcesanspro_regular"
            android:fontStyle="normal"
            android:fontWeight="400"
            app:font="@font/sourcesanspro_regular"
            app:fontStyle="normal"
            app:fontWeight="400" />

</font-family>

Se i tipi di carattere vengono forniti a un'applicazione Android in modo appropriato, possono essere applicati a un widget dell'interfaccia utente impostando l'attributo fontFamily. Ad esempio, il frammento di codice seguente illustra come visualizzare un tipo di carattere in un controllo TextView:

<TextView
    android:text="The quick brown fox jumped over the lazy dog."
    android:fontFamily="@font/sourcesanspro_regular"
    app:fontFamily="@font/sourcesanspro_regular"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

Questa guida illustra innanzitutto come usare i tipi di carattere come risorsa Android e quindi procedere per illustrare come scaricare i tipi di carattere in fase di esecuzione.

Tipi di carattere come risorsa

La creazione di un tipo di carattere in un APK Android garantisce che sia sempre disponibile per l'applicazione. Un file di tipo di carattere (un oggetto . TTF o . Il file OTF) viene aggiunto a un'applicazione Xamarin.Android come qualsiasi altra risorsa, copiando i file in una sottodirectory nella cartella Resources di un progetto Xamarin.Android. Le risorse dei tipi di carattere vengono mantenute in una sottodirectory del tipo di carattere della cartella Resources del progetto.

Nota

I tipi di carattere devono avere un'azione di compilazione di AndroidResource o non verranno inseriti nel pacchetto dell'APK finale. L'azione di compilazione deve essere impostata automaticamente dall'IDE.

Quando sono presenti molti file di carattere simili (ad esempio, lo stesso tipo di carattere con pesi o stili diversi) è possibile raggrupparli in una famiglia di caratteri.

Famiglie di caratteri

Una famiglia di caratteri è un set di tipi di carattere con pesi e stili diversi. Ad esempio, potrebbero essere presenti file di carattere separati per i tipi di carattere grassetto o corsivo. La famiglia di caratteri è definita dagli font elementi di un file XML che viene mantenuto nella directory Resources/font . Ogni famiglia di caratteri deve avere il proprio file XML.

Per creare una famiglia di caratteri, aggiungere prima tutti i tipi di carattere alla cartella Risorse/tipo di carattere . Creare quindi un nuovo file XML nella cartella font per la famiglia di caratteri. Il nome del file XML non ha affinità o relazione con i tipi di carattere a cui si fa riferimento; il file di risorse può essere qualsiasi nome legale del file di risorse Android. Questo file XML avrà un elemento radice font-family che contiene uno o più font elementi. Ogni font elemento dichiara gli attributi di un tipo di carattere.

Il codice XML seguente è un esempio di famiglia di caratteri per il tipo di carattere Sources Sans Pro che definisce molti spessori di carattere diversi. Questo file viene salvato come file nella cartella Resources/font denominata sourcesanspro.xml:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto">
    <font android:font="@font/sourcesanspro_regular"
          android:fontStyle="normal"
          android:fontWeight="400"
          app:font="@font/sourcesanspro_regular"
          app:fontStyle="normal"
          app:fontWeight="400" />
    <font android:font="@font/sourcesanspro_bold"
          android:fontStyle="normal"
          android:fontWeight="800"
          app:font="@font/sourcesanspro_bold"
          app:fontStyle="normal"
          app:fontWeight="800" />
    <font android:font="@font/sourcesanspro_italic"
          android:fontStyle="italic"
          android:fontWeight="400"
          app:font="@font/sourcesanspro_italic"
          app:fontStyle="italic"
          app:fontWeight="400" />
</font-family>

L'attributo fontStyle ha due valori possibili:

  • normal : tipo di carattere normale
  • corsivo: carattere corsivo

L'attributo fontWeight corrisponde all'attributo CSS font-weight e fa riferimento allo spessore del tipo di carattere. Si tratta di un valore compreso nell'intervallo compreso tra 100 e 900. L'elenco seguente descrive i valori comuni di spessore del carattere e il relativo nome:

  • Sottile - 100
  • Luce extra - 200
  • Luce – 300
  • Normale - 400
  • Medio - 500
  • Semi Grassetto - 600
  • Grassetto - 700
  • Grassetto aggiuntivo - 800
  • Nero - 900

Dopo aver definito una famiglia di caratteri, può essere usata in modo dichiarativo impostando gli fontFamilyattributi , textStylee fontWeight nel file di layout. Ad esempio, il frammento XML seguente imposta un tipo di carattere da 600 pesi (normale) e uno stile di testo corsivo:

<TextView
    android:text="Sans Source Pro semi-bold italic, 600 weight, italic"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fontFamily="@font/sourcesanspro"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_horizontal"
    android:fontWeight="600"
    android:textStyle="italic"
    />

Assegnazione di tipi di carattere a livello di codice

I tipi di carattere possono essere impostati a livello di codice utilizzando il Resources.GetFont metodo per recuperare un Typeface oggetto . Molte visualizzazioni hanno una TypeFace proprietà che può essere usata per assegnare il tipo di carattere al widget. Questo frammento di codice mostra come impostare il tipo di carattere a livello di codice in un controllo TextView:

Android.Graphics.Typeface typeface = this.Resources.GetFont(Resource.Font.caveat_regular);
textView1.Typeface = typeface;
textView1.Text = "Changed the font";

Il GetFont metodo caricherà automaticamente il primo tipo di carattere all'interno di una famiglia di caratteri. Per caricare un tipo di carattere corrispondente a uno stile specifico, utilizzare il Typeface.Create metodo . Questo metodo tenterà di caricare un tipo di carattere corrispondente allo stile specificato. Ad esempio, questo frammento di codice tenterà di caricare un oggetto grassetto Typeface da una famiglia di caratteri definita in Risorse/tipi di carattere:

var typeface = Typeface.Create("<FONT FAMILY NAME>", Android.Graphics.TypefaceStyle.Bold);
textView1.Typeface = typeface;

Download dei tipi di carattere

Anziché creare pacchetti di tipi di carattere come risorsa dell'applicazione, Android può scaricare i tipi di carattere da un'origine remota. Questo avrà l'effetto auspicabile di ridurre le dimensioni dell'APK.

I tipi di carattere vengono scaricati con l'assistenza di un provider di tipi di carattere. Si tratta di un provider di contenuti specializzato che gestisce il download e la memorizzazione nella cache dei tipi di carattere in tutte le applicazioni nel dispositivo. Android 8.0 include un provider di tipi di carattere per scaricare i tipi di carattere da Google Font Repository. Questo provider di tipi di carattere predefinito viene sottoposto a backporting al livello API 14 con la libreria di supporto Android v26.

Quando un'app effettua una richiesta di un tipo di carattere, il provider di tipi di carattere verificherà innanzitutto se il tipo di carattere è già presente nel dispositivo. In caso contrario, tenterà di scaricare il tipo di carattere. Se il tipo di carattere non può essere scaricato, Android userà il tipo di carattere di sistema predefinito. Una volta scaricato il tipo di carattere, è disponibile per tutte le applicazioni nel dispositivo, non solo per l'app che ha effettuato la richiesta iniziale.

Quando viene effettuata una richiesta per scaricare un tipo di carattere, l'app non esegue direttamente una query sul provider di tipi di carattere. Le app useranno invece un'istanza dell'API FontsContract (o FontsContractCompat se viene usata la libreria di supporto 26).

Android 8.0 supporta il download dei tipi di carattere in due modi diversi:

  1. Dichiarare tipi di carattere scaricabili come risorsa : un'app può dichiarare tipi di carattere scaricabili in Android tramite file di risorse XML. Questi file conterranno tutti i metadati che Android deve scaricare in modo asincrono i tipi di carattere all'avvio dell'app e memorizzarli nella cache nel dispositivo.
  2. A livello di codice: le API nel livello API Android 26 consentono a un'applicazione di scaricare i tipi di carattere a livello di codice, mentre l'applicazione è in esecuzione. Le app creeranno un FontRequest oggetto per un determinato tipo di carattere e passeranno questo oggetto alla FontsContract classe . FontsContract accetta FontRequest e recupera il tipo di carattere da un provider di tipi di carattere. Android scaricherà in modo sincrono il tipo di carattere. Un esempio di creazione di verrà FontRequest illustrato più avanti in questa guida.

Indipendentemente dall'approccio usato, i file di risorse che devono essere aggiunti all'applicazione Xamarin.Android prima di poter scaricare i tipi di carattere. Prima di tutto, i tipi di carattere devono essere dichiarati in un file XML nella directory Resources/font come parte di una famiglia di caratteri. Questo frammento di codice è un esempio di come scaricare i tipi di carattere dalla raccolta Open Source di Google Fonts usando il provider di tipi di carattere predefinito fornito con Android 8.0 (o libreria di supporto v26):

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:fontProviderAuthority="com.google.android.gms.fonts"
             android:fontProviderPackage="com.google.android.gms"
             android:fontProviderQuery="VT323"
             android:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
             app:fontProviderAuthority="com.google.android.gms.fonts"
             app:fontProviderPackage="com.google.android.gms"
             app:fontProviderQuery="VT323"
             app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
>
</font-family>

L'elemento font-family contiene gli attributi seguenti, dichiarando le informazioni richieste da Android per scaricare i tipi di carattere:

  1. fontProviderAuthority : autorità del provider di tipi di carattere da usare per la richiesta.
  2. fontPackage : pacchetto per il provider di tipi di carattere da utilizzare per la richiesta. Viene usato per verificare l'identità del provider.
  3. fontQuery : stringa che consente al provider di tipi di carattere di individuare il tipo di carattere richiesto. I dettagli sulla query del tipo di carattere sono specifici del provider di tipi di carattere. La QueryBuilder classe nell'app di esempio Tipi di carattere scaricabili fornisce alcune informazioni sul formato di query per i tipi di carattere della raccolta Open Source di Google Fonts.
  4. fontProviderCerts : matrice di risorse con l'elenco di set di hash per i certificati con cui il provider deve essere firmato.

Una volta definiti i tipi di carattere, potrebbe essere necessario fornire informazioni sui certificati dei tipi di carattere coinvolti nel download.

Certificati dei tipi di carattere

Se il provider di tipi di carattere non è preinstallato nel dispositivo o se l'app usa la Xamarin.Android.Support.Compat libreria, Android richiede i certificati di sicurezza del provider di tipi di carattere. Questi certificati verranno elencati in un file di risorse di matrice che viene mantenuto nella directory Resources/values .

Ad esempio, il codice XML seguente è denominato Resources/values/fonts_cert.xml e archivia i certificati per il provider di tipi di carattere Google:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="com_google_android_gms_fonts_certs">
        <item>@array/com_google_android_gms_fonts_certs_dev</item>
        <item>@array/com_google_android_gms_fonts_certs_prod</item>
    </array>
    <string-array name="com_google_android_gms_fonts_certs_dev">
        <item>
            MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
        </item>
    </string-array>
    <string-array name="com_google_android_gms_fonts_certs_prod">
        <item>
            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
        </item>
    </string-array>
</resources>

Con questi file di risorse, l'app è in grado di scaricare i tipi di carattere.

Dichiarazione dei tipi di carattere scaricabili come risorse

Elencando i tipi di carattere scaricabili nella AndroidManifest.XML, Android scaricherà in modo asincrono i tipi di carattere all'avvio dell'app. Il tipo di carattere stesso è elencato in un file di risorse di matrice, simile al seguente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="downloadable_fonts" translatable="false">
        <item>@font/vt323</item>
    </array>
</resources>

Per scaricare questi tipi di carattere, devono essere dichiarati in AndroidManifest.XML aggiungendo meta-data come elemento figlio dell'elemento application . Ad esempio, se i tipi di carattere scaricabili vengono dichiarati in un file di risorse in Risorse/valori/downloadable_fonts.xml, questo frammento di codice dovrà essere aggiunto al manifesto:

<meta-data android:name="downloadable_fonts" android:resource="@array/downloadable_fonts" />

Download di un tipo di carattere con le API font

È possibile scaricare a livello di codice un tipo di carattere creando un'istanza di un FontRequest oggetto e passandolo al FontContractCompat.RequestFont metodo . Il FontContractCompat.RequestFont metodo verificherà innanzitutto se il tipo di carattere esiste nel dispositivo e, se necessario, eseguirà una query asincrona sul provider di tipi di carattere e tenterà di scaricare il tipo di carattere per l'app. Se FontRequest non è possibile scaricare il tipo di carattere, Android userà il tipo di carattere di sistema predefinito.

Un FontRequest oggetto contiene informazioni che verranno utilizzate dal provider di tipi di carattere per individuare e scaricare un tipo di carattere. A FontRequest richiede quattro informazioni:

  1. Autorità provider di tipi di carattere: autorità del provider di tipi di carattere da usare per la richiesta.
  2. Pacchetto del tipo di carattere: pacchetto per il provider di tipi di carattere da usare per la richiesta. Viene usato per verificare l'identità del provider.
  3. Query tipo di carattere: stringa che consente al provider di tipi di carattere di individuare il tipo di carattere richiesto. I dettagli sulla query del tipo di carattere sono specifici del provider di tipi di carattere. I dettagli della stringa sono specifici del provider di tipi di carattere. La QueryBuilder classe nell'app di esempio Tipi di carattere scaricabili fornisce alcune informazioni sul formato di query per i tipi di carattere della raccolta Open Source di Google Fonts.
  4. Certificati provider di tipi di carattere: matrice di risorse con l'elenco di set di hash per i certificati con cui deve essere firmato il provider.

Questo frammento di codice è un esempio di creazione di un'istanza di un nuovo FontRequest oggetto:

FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms", <FontToDownload>, Resource.Array.com_google_android_gms_fonts_certs);

Nel frammento di codice FontToDownload precedente è presente una query che aiuterà il tipo di carattere della raccolta Open Source di Google Fonts.

Prima di passare l'oggetto FontRequest al FontContractCompat.RequestFont metodo , è necessario creare due oggetti:

  • FontsContractCompat.FontRequestCallback – Si tratta di una classe astratta che deve essere estesa. È un callback che verrà richiamato al RequestFont termine. Un'app Xamarin.Android deve sottoclassare FontsContractCompat.FontRequestCallback ed eseguire l'override di OnTypefaceRequestFailed e OnTypefaceRetrieved, specificando le azioni da eseguire quando il download ha esito negativo o ha esito positivo rispettivamente.
  • Handler – Si tratta di un oggetto Handler che verrà utilizzato da RequestFont per scaricare il tipo di carattere in un thread, se necessario. I tipi di carattere non devono essere scaricati nel thread dell'interfaccia utente.

Questo frammento di codice è un esempio di una classe C# che scaricherà in modo asincrono un tipo di carattere dalla raccolta Open Source di Google Fonts. Implementa l'interfaccia FontRequestCallback e genera un evento C# al FontRequest termine.

public class FontDownloadHelper : FontsContractCompat.FontRequestCallback
{
    // A very simple font query; replace as necessary
    public static readonly String FontToDownload = "Courgette";

    Android.OS.Handler Handler = null;

    public event EventHandler<FontDownloadEventArg> FontDownloaded = delegate
    {
        // just an empty delegate to avoid null reference exceptions.  
    };

    public void DownloadFonts(Context context)
    {
        FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms",FontToDownload , Resource.Array.com_google_android_gms_fonts_certs);
        FontsContractCompat.RequestFont(context, request, this, GetHandlerThreadHandler());
    }

    public override void OnTypefaceRequestFailed(int reason)
    {
        base.OnTypefaceRequestFailed(reason);
        FontDownloaded(this, new FontDownloadEventArg(null));
    }

    public override void OnTypefaceRetrieved(Android.Graphics.Typeface typeface)
    {
        base.OnTypefaceRetrieved(typeface);
        FontDownloaded(this, new FontDownloadEventArg(typeface));
    }

    Handler GetHandlerThreadHandler()
    {
        if (Handler == null)
        {
            HandlerThread handlerThread = new HandlerThread("fonts");
            handlerThread.Start();
            Handler = new Handler(handlerThread.Looper);
        }
        return Handler;
    }
}

public class FontDownloadEventArg : EventArgs
{
    public FontDownloadEventArg(Android.Graphics.Typeface typeface)
    {
        Typeface = typeface;
    }
    public Android.Graphics.Typeface Typeface { get; private set; }
    public bool RequestFailed
    {
        get
        {
            return Typeface != null;
        }
    }
}

Per usare questo helper, viene creato un nuovo FontDownloadHelper e viene assegnato un gestore eventi:

var fontHelper = new FontDownloadHelper();

fontHelper.FontDownloaded += (object sender, FontDownloadEventArg e) =>
{
    //React to the request
};
fontHelper.DownloadFonts(this); // this is an Android Context instance.

Riepilogo

Questa guida ha illustrato le nuove API in Android 8.0 per supportare i tipi di carattere e i tipi di carattere scaricabili come risorse. Ha illustrato come incorporare i tipi di carattere esistenti in un APK e usarli in un layout. Ha anche illustrato come Android 8.0 supporta il download dei tipi di carattere da un provider di tipi di carattere, a livello di codice o dichiarando i metadati del tipo di carattere nei file di risorse.