Czcionki w Androidzie

Od początku Androida nie było gotowego rozwiązania do używania niestandardowych czcionek. Dostępny był tylko niewielki zestaw wstępnie zainstalowanych czcionek na urządzeniu. Trzeba było być kreatywnym i napisać dużo kodu dla tak trywialnych rzeczy.

Ostatnio firma Google wprowadziła niestandardowe i możliwość pobrania czcionki dla systemu Android. Czcionki są nieodzowną częścią interfejsu graficznego użytkownika. Projektując wygląd aplikacji również powiniśmy zwrócic uwagę na krój pisma. Jest to ważne nie tylko ze względu na czytelność tekstu, ale również integracji z wizerunkiem marki. Zobaczmy jak działają czcionki w Androidzie i co z nimi możemy zrobić.

Jak ustawić czcionkę w Androidzie?

Domyślnie Android posiada kilka krojów pisma. Możemy ustawić odpowiednią czcionkę w TextView w ten sposób:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="sans-serif"
    android:text="MYENV.NET" />

Lub z poziomu pliku ze stylem:

<style name= "AppTheme" parent= "Theme.AppCompat.Light.DarkActionBar">
    <item name= "android:fontFamily" > sans-serif-light </item>
</style>

Oczywiście istnieją również inne atrybuty, które umożliwią Ci powiększenie czcionki lub jej pogrubienie.

Niestandardowe czcionki w Androidzie

Android 8.0 (poziom API 26) wprowadził nową funkcję, która pozwala używać czcionek jako zasobów. Zasób czcionek określa niestandardową czcionkę, której można używać w aplikacji. Czcionki mogą być pojedynczymi plikami lub zbiorem plików, znanym jako rodzina czcionek, które są zdefiniowane w pliku XML Wystarczy umieścić pliki czcionek w folderze res/font/. Czcionki są kompilowane i automatycznie dostępne w systemie jako zasób. Możesz uzyskać do nich dostęp w ten sposób:

// XML
android:fontFamily="@font/myFont"
// KOTLIN
val typeface = resources.getFont(R.font.myFont)
textView.typeface = typeface
// SUPPORT LIBRARY v26
val typeface = ResourcesCompat.getFont (this, R.font.myFont)
textView.typeface = typeface

Aby skorzystać z tej opcji, musisz ustawić minSdkVersion na Oreo. Jeżeli chciałbyś mieć możliwość ustawienia niestandardowych fontów we wcześniejszych wersjach Androida, wystarczy zastosować Android Support Library w wersji 26. Dzięki temu użyjesz funkcji na urządzeniach z Androidem 4.1 (poziom API 16) i wyższych.

Uzupełnij wiedzę o: Ikony FontAwesome w Androidzie

Rodzina czcionek

Istnieje również inna funkcja. Rodzina czcionek to zestaw czcionek wraz ze szczegółami stylu. W systemie Android można utworzyć nową rodzinę czcionek jako zasób XML i uzyskać do nich dostęp jako pojedynczą jednostkę, zamiast odwoływać się do każdego stylu. W ten sposób system może wybrać prawidłową czcionkę na podstawie stylu tekstu, którego próbujesz użyć. Przykładowy plik może wyglądać następująco:

<?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">

    <!-- regular -->
    <font
        android:font="@font/buenard"
        android:fontStyle="normal"
        android:fontWeight="400"

        app:font="@font/buenard"
        app:fontStyle="normal"
        app:fontWeight="400" />

    <!-- italic -->
    <font
        android:font="@font/buenard"
        android:fontStyle="italic"
        android:fontWeight="400"

        app:font="@font/buenard"
        app:fontStyle="italic"
        app:fontWeight="400" />

</font-family>

Pamiętaj, że aby zachować zgodność wsteczną z wersjami starszymi niż 8.0, musisz zadeklarować wszystkie właściwości czcionek w przestrzeni nazw „app’.

Teraz wystarczy w układzie wyglądu dodać atrybut android:fontFamily do TextView i gotowe!

Czcionki do pobrania

Oprócz czcionek w formacie XML, Android Oreo i biblioteka wsparcia wprowadziła obsługę czcionek do pobrania z kompatybilnością wsteczną aż do interfejsu API 14. Czcionki do pobrania umożliwiają aplikacjom żądanie krojów pisma od aplikacji dostawcy czcionek zamiast dołączania plików czcionek do apk. Dostawca czcionek pobiera odpowiednie pliki i buforuje je lokalnie, aby inne aplikacje mogły również skorzystać z tych fontów.

 Downloadable Fonts process in Android

Jak widać na powyższym obrazku, aplikacje korzystające z czcionek do pobrania tworzą obiekt FontRequest przy użyciu FontsContract API, który pobiera krój pisma od dostawcy. Dostawca czcionek nie musi pobierać czcionek, jeśli już istnieje w pamięci podręcznej odpowiedni plik.

Usługi Google Play (na urządzeniach z wersją 11+) to jeden z takich dostawców czcionek. Właśnie z niego możesz pobierać czcionki Google. Nie ma jeszcze dokumentacji dotyczącej tego, jak wdrożyć własnego dostawcę czcionek, jeśli chcesz użyć niestandardowej czcionki niedostępnej w usługach Google, musisz używać czcionek w formacie XML.

Zalety używania czcionek do pobrania to:

  • Pliki są pobierane tylko wtedy, gdy jest to wymagane.
  • Zmniejszony rozmiar pliku APK – co może znacząco wpłynąć na instalacje aplikacji.
  • Ponieważ aplikacje mogą udostępniać czcionki tego samego dostawcy, powoduje to mniejsze zużycie cennej pamięci, miejsca na dysku i danych komórkowych.

Pobieranie czcionek za pomocą pliku XML

Zobaczmy, jak pobierać czcionki przy użyciu XML. Stwórz nowy plik XML w folderze res/font/ o zawartości:

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

Teraz musisz stworzyć tablicę zawierającą wszystkie utworzone przez Ciebie pliki XML czcionek. W tym celu w folderze res/values/ stwórz plik preloaded_fonts.xml:

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

Możesz określić czcionki, które Android powinien wstępnie załadować przed uruchomieniem aplikacji. Aby to zrobić, musisz podać je w manifeście. W AndroidManifest.xml utwórz element meta-data, który każe Androidowi wstępnie załadować wszystkie czcionki, które zadeklarowałeś w niestandardowych czcionkach w zasobach res/font.

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

Pozostał jeszcze nam plik z certyfikatami. Dla dostawcy Google będzie się tak prezentował:

<?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>

Pobieranie czcionek programowo

Deklarowanie czcionek w XML i używanie ich w układach XML jest świetne. Istnieją jednak sytuacje, w których konieczne będzie ładowanie krojów pisma na żądanie. Co będzie Ci potrzebne?

  • Autorytet dostawcy czcionek
  • Pakiet dostawcy czcionek służący do weryfikacji tożsamości dostawcy
  • Zapytanie o ciąg czcionki. Aby uzyskać więcej informacji na temat formatów zapytań, zobacz dokumentację dostawcy czcionek, na przykład Czcionki Google.
  • Lista certyfikatów w celu weryfikacji tożsamości dostawcy.

Czyli podobne rzeczy jak w przypadku XML. Poniżej znajduje się kod, który pobiera czcionki z Google Fonts.

val query = "name=Acme"

val fontRequest = FontRequest(
    "com.google.android.gms.fonts",
    "com.google.android.gms",
    query,
    R.array.com_google_android_gms_fonts_certs
)

val fontCallback: FontsContractCompat.FontRequestCallback =
    object : FontsContractCompat.FontRequestCallback() {
        override fun onTypefaceRetrieved(typeface: Typeface) { // If we got our font apply it to the toolbar
            Log.d(TAG, "Download font successfully completed")
            textview.setTypeface(typeface)
        }
        override fun onTypefaceRequestFailed(reason: Int) {
            Log.w(TAG,"Failed to fetch font: $reason")
        }
    }

val handlerThread = HandlerThread("fonts")
handlerThread.start()
val handler = Handler(handlerThread.looper)

FontsContractCompat.requestFont(this, fontRequest, fontCallback, handler)

Żądanie czcionki do pobrania jest operacją asynchroniczną. Metoda requestFont() przekazuje wynik przez FontsContractCompat. Jeśli żądanie zakończy się powodzeniem, FontContractorCompat wywoła onTypefaceRetreived(). Użyj instancji Typeface, aby ustawić czcionkę w widoku. W przeciwnym wypadku zostanie wywołana metoda onTypefaceRequestFailed().

Ostatnią rzeczą, której potrzebujesz, gdy żądasz czcionek, jest Handler. FontContractorCompat używa go do pobierania czcionki w tle. Upewnij się, że podałeś Handler, który nie jest powiązany z głównym wątkiem interfejsu użytkownika.

Pobieranie czcionek za pomocą Androida Studio

Najprostszym sposobem na uzyskanie czcionek jest użycie Android Studio do zaimportowania czcionek Google, ponieważ spowoduje to skonfigurowanie tego wszystkiego o czym pisałem wyżej. 

Edytorze układu (jako widok, nie kod) wybierz TextView, w którym chcesz zastosować wybraną czcionkę. Następnie w obszarze Właściwości (po prawej stronie) wybierz fontFamily > More Fonts. Spowoduje to otwarcie okna dialogowego. Właśnie w tym miejscu możesz wybrać czcionkę oraz czy ma zostać dodana do projektu lub pobrana po uruchomieniu aplikacji. Niezależenie którą opcję wybierzesz, Android Studio wygeneruje odpowiednie pliki.

Fonts in Android Studio

Pobieranie informacji o czcionce

Aby uzyskać informacje o dostępnych czcionkach, skorzystaj fetchFonts()FontsContractCompat. Podobnie jak w poprzednim sekcji, utwórz FontRequest. W dalszej kolejności przekaż obiekt do fetchFonts(). Spowoduje to zwrócenie informacji o żądanej rodzinie czcionek, jeśli jest ona dostępna pod daną nazwą.

val query = "name=Acme"

val fontRequest = FontRequest(
    "com.google.android.gms.fonts",
    "com.google.android.gms",
    query,
    R.array.com_google_android_gms_fonts_certs
)
val result = FontsContractCompat.fetchFonts (this, null, fontRequest)

if (result.statusCode == FontsContractCompat.FontFamilyResult.STATUS_OK) {

    result.fonts.iterator().forEach {
        Log.d(TAG, it.weight.toString() )
        Log.d(TAG, it.isItalic.toString() )
    }

Każda czcionka ma kilka właściwości:

  • uri – identyfikator URI skojarzony z plikiem czcionek przez dostawcę czcionek
  • weight – waga czcionki jako liczba całkowita
  • isItalic – wartość logiczna, jeśli true czcionka ma kursywę
  • i wiele innych, sprawdź 🙂

Pobieranie danych o czcionkach to operacja blokująca, którą należy wykonać w tle.

Czcionki zmienne

W 2016 roku został wydany format OpenType w wersji 1.8. Umieszczono w nim zupełnie nową technologię: czcionki zmienne. Ta technologia pozwala jednej czcionce zachowywać się jak wiele fontów. Odbywa się to poprzez zdefiniowanie odmian czcionki.

Zmienne czcionki mogą zarówno uprościć naszą strukturę czcionek, jak i poprawić wydajność. Weźmy na przykład sytuację, w której Twoja aplikacja potrzebuje pięciu stylów czcionek. Byłoby znacznie mniejsze i szybsze zapewnienie jednej zmiennej czcionki zdolnej do renderowania tych pięciu stylów niż konieczność ładowania pięciu różnych plików.

W celu ustawienia odpowiednich parametrów czcionki, wykorzystaj poniższy kod:

 textView.fontVariationSettings = "'wght' 1000, 'wdth' 1000"

W powyższym przykładzie zmieniamy odstęp między znakami oraz ich grubość. Wraz z nadejściem Androidzie Q, możemy ustawiać zmienność czcionki z poziomu kodu XML.

<TextView
...
app:fontVariationSettings="'wght' 900, 'wdth' 900"
... />

Każda czcionka zmienna może definiować własne parametry. Również nie każda czcionka obsługuje tę funkcję. Zanim użyjesz tej technologi sprawdź dokumentację czcionki.

Używaj wielu niestandardowych czcionek w tym samym widoku

Klasa Button akceptuje tylko jeden krój pisma, który jest ustawiany na tekście. W Androidzie Q istnieje możliwość tworzenie kroju pisma z wielu rodzin czcionek za pomocą nowego interfejsu API Typeface.CustomFallbackBuilder. Podczas tworzenia kroju pisma za pomocą tego konstruktora można dodać maksymalnie 64 rodzin czcionek. Aby to zrozumieć, spójrzmy na przykład.

font in Android button

Na powyższym obrazku mamy jeden przycisk, a na przycisku jest jedna ikona kłódki, a tekst jest po obu stronach ikony. Tak więc dla ikony potrzebujemy innej czcionki, a dla pozostałego tekstu chcemy użyć innego kroju pisma. Sytuacja staje się gorsza, jeśli mamy więcej niż jeden język z więcej niż jedną czcionką.

Czcionki w Androidzie

Tak więc w Android Q CustomFallbackBuilder umożliwia tworzenie kroju pisma z wieloma czcionkami lub rodziną czcionek. Poniżej znajduje się przykład ikony i czcionki:

button.typeface = Typeface.CustomFallbackBuilder(
    // add the Latin font
    FontFamily.Builder(
        Font.Builder(assets, "MutatorSans.ttf").build()
    ).build()
).addCustomFallback(
    // add the icon font
    FontFamily.Builder(
        Font.Builder(assets, "material-icon-font.ttf").build()
    ).build()
).build()

Teraz w XML wystarczy dodać:

android:text="Welcome in  Yeaa!"

Ciąg „&xe0b8;” odpowiada za ikonę. Kolejny przykład przedstawia wiele języków i wiele czcionek:

textView.typeface = Typeface.CustomFallbackBuilder(
    FontFamily.Builder(
        Font.Builder(assets, "lato.ttf").build()
    ).build()
).addCustomFallback(
    FontFamily.Builder(
        Font.Builder(assets, "kosugi.ttf").build()
    ).build()
).build()

Ogólnie rzecz biorąc, system wykonuje sekwencyjne wyszukiwanie czcionek. Na przykład, jeśli czcionką jest Lato, wówczas wyszuka Lato. Jeśli ona nie jest obecna, system użyje rezerwowego przypadku użycia czcionki systemowej. Poniżej znajduje się kod, który zdefiniuje systemową czcionkę zastępczą:

Typeface.CustomFallbackBuilder(
    FontFamily.Builder(
        Font.Builder(assets, "lato.ttf").build()
    ).build()
).setSystemFallback("sans-serif")
.build()

Zatem w powyższym przykładzie, jeśli znak nie jest obsługiwany przez czcionkę Lato, wówczas system użyje czcionki sans-serif.

Podczas tworzenia czcionki, Font.Builder może przyjąć dodatkowe argumenty: grubość i nachylenie czcionki:

Font.Builder(assets, "lato_bold_italic.ttf")
    .setWeight(700)
    .setSlant(FontStyle.FONT_SLANT_ITALIC)
    .build()

Nie musimy ograniczać się tylko do przycisków. Gdzie możemy jeszcze taki mechanizm wykorzystać? Bardzo dobrym pomysłem jest umieszczenie takich złożonych znaków w instrukcjach obsługi danej aplikacji.

Zobacz także:

Czcionki systemowe

Android obsługuje ponad 100 języków i wszystkie te języki mogą wymagać różnych plików czcionek. Na przykład w telefonie Google Pixel 3 jest zainstalowanych ponad 270 plików czcionek. Wiedza o tym, która czcionka systemowa może renderować dany znak, nie jest prosta.

Aplikacje NDK wykonujące własne renderowanie tekstu, takie jak gry lub przeglądarki dokumentów, potrzebują tych informacji. W systemie Android Q można pobrać obsługiwaną czcionkę systemową dla ciągu za pomocą interfejsu FontMatcher. Właśnie to API służy do znalezienia czcionki systemowej, która może renderować dany tekst. Na przykład:

// APP NDK

// font = NotoSansCJK-Regular.ttc
// length = 2
auto[font, length] = AFontMatcher_match("たすく a.k.a. のな");

// font = Roboto-Regular.ttf
// length = 8
auto[font, length] = AFontMatcher_match(" a.k.a. のな");

// font = NotoSansCJK-Regular.ttc
// length = 2
auto[font, length] = AFontMatcher_match("のな");

API zwraca nam obiekt czcionki i długość. Ten interfejs nigdy nie zwróci wskaźnika zerowego. Jeśli żadna czcionka nie jest renderowana, zwróci obiekt czcionki bajtowej. Ten obiekt czcionki powinien być używany do rysowania brakującego symbolu o nazwie Tofu. Ponadto, jeśli żadna czcionka nie zostanie dopasowana, interfejs API zwróci czcionkę najbliższą wymaganej czcionce.

Jeśli chcesz wiedzieć, które pliki czcionek znajdują się w systemie Android, możesz to znaleźć za pomocą odpowiedniego interfejsu API. Umożliwi to dostęp do plików czcionek zainstalowanych w systemie. Ten interfejs API do wyszukiwania czcionek nie jest tak szybki. Dlatego zaleca się buforowanie wyniku, który będzie obecny przy następnej aktualizacji systemu, ponieważ czcionki systemowe są tylko do odczytu i są aktualizowane podczas aktualizacji systemu.

for(font in SystemFonts.getAvailableFonts()) {
    ...
}

Android Q dostał również nową czcionkę: Myanmar, która obsługuje birmański Unicode. Oznacza to, że począwszy od Androida Q, system ułatwia użytkownikom przejście na Unicode. Użytkownik może teraz użyć czcionki Unicode, aby po raz pierwszy odczytać tekst Unicode i inny niż Unicode.

Dzielenie wyrazów

Wyświetlanie tekstu jest ważnym zadaniem w większości aplikacji, dlatego w Androidzie Q nadal wprowadzono nowe funkcje, które wspierają Twoje potrzeby i poprawiają wydajność.

hypenation in Android

Biorąc pod uwagę, że dzielenie wyrazów często nie jest potrzebne dla wszystkich aplikacji i ze względu na wpływ na wydajność zespół Androida postanowił, że dzielenie wyrazów domyślnie będzie wyłączone w Androidzie Q i AppCompat v1.1.0. Jeśli chcesz użyć dzielenia wyrazów, musisz ręcznie włączyć tę funkcję w aplikacji, ustawiając częstotliwość dzielenia wyrazów na normalną. Możesz to ustawić na wiele sposobów:

<TextView 
    android: hyphenationFrequency="normal"
    ... />  

Za pomocą kodu:

textView.hyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NORMAL

Dowiedz się więcej o tym, jak działa dzielenie wyrazów oglądając to nagranie.

Dotarliśmy do końca! Mam nadzieję, że nauczyłeś się dzisiaj czegoś nowego 🙂 Udostępnij ten blog innym programistom, aby rozpowszechniać wiedzę.