התכונה 'גופנים שניתן להורדה' מאפשרת לממשקי API לבקש גופנים מאפליקציית ספק במקום לקבץ קבצים באפליקציה או לאפשר לאפליקציה להוריד גופנים. הגופנים שניתן להוריד זמינים במכשירים עם Android API מגרסה 14 ואילך דרך ספריית AndroidX Core.
היתרונות של גופנים שניתן להורדה:
- הקטנת גודל האפליקציה, וכתוצאה מכך הגדלת שיעור ההתקנות של האפליקציה.
- שיפור התקינות הכוללת של המערכת, כי כמה אפליקציות יכולות לשתף את אותו גופן דרך ספק. הפעולה הזו חוסכת למשתמשים נתונים סלולריים, זיכרון הטלפון ומקום בכונן. במודל הזה, הגופן מאוחזר מהרשת לפי הצורך.
איך פועלים גופנים שניתן להורדה?
ספק גופנים הוא אפליקציה שמאחזרת גופנים ושומרת אותם במטמון באופן מקומי, כדי שאפליקציות אחרות יוכלו לבקש ולשתף גופנים. האיור הבא ממחיש את התהליך.
העקרונות הבסיסיים
אפשר להשתמש בתכונה 'גופנים שניתן להורדה' בדרכים הבאות, שמפורטות בהמשך:
שימוש בגופנים שניתן להורדה באמצעות Android Studio ו-Google Play Services
אתם יכולים להגדיר שהאפליקציה תוריד גופנים באמצעות Android Studio 3.0 ואילך. כדי לעזור לכם להתחיל להשתמש בתכונות של 'גופנים שניתן להורדה', תוכלו להשתמש בספק הגופנים משירותי Google Play.
- בעורך הפריסה, בוחרים
TextView
. לאחר מכן, בקטע מאפיינים, בוחרים באפשרות fontFamily > גופנים נוספים. החלון Resources יופיע. - בתפריט מקור, בוחרים באפשרות Google Fonts.
- בתיבה גופנים, בוחרים גופן בקטע 'ניתן להורדה'.
- בוחרים באפשרות יצירת גופן שניתן להורדה ולוחצים על אישור.
מערכת Android Studio יוצרת באופן אוטומטי את קובצי ה-XML הרלוונטיים שנדרשים כדי להציג את הגופן בצורה נכונה באפליקציה.
שימוש בגופנים שניתן להורדה באופן פרוגרמטי
החל מגרסה 8.0 של Android (רמת API 26), AndroidX Core מספק תמיכה מלאה בגופנים שניתן להורדה. מידע נוסף על השימוש בספריית AndroidX Core זמין בקטע ספריית AndroidX Core של גופנים שניתן להורדה בדף הזה.
כדי להשתמש באופן פרוגרמטי בתכונה 'גופנים שניתנים להורדה', יש ליצור אינטראקציה עם שתי סוגי מפתחות:
android.graphics.fonts.FontRequest
: המחלקה הזו מאפשרת ליצור בקשה לשימוש בגופן.FontsContractCompat
: המחלקה הזו מאפשרת ליצור אובייקטTypeface
חדש על סמך בקשת הגופן.
האפליקציה מאחזרת גופנים מספק הגופנים באמצעות ה-API של FontsContract
. לכל ספק יש קבוצה משלו של הגבלות על גרסאות Android ושפת השאילתות שהוא תומך בהן. למידע נוסף על גרסת Android ועל פורמט השאילתה, אפשר לעיין במסמכי העזרה של הספק.
כדי להוריד גופן, מבצעים את השלבים הבאים:
- יוצרים מכונה של המחלקה
android.graphics.fonts.FontRequest
כדי לבקש את הגופן מהספק. כדי ליצור בקשה, מעבירים את הפרמטרים הבאים:- הרשות של ספק הגופן.
- חבילת ספק הגופן לאימות הזהות של הספק.
- שאילתת המחרוזת של הגופן. מידע נוסף על פורמטים של שאילתות זמין במסמכי העזרה של ספק הגופן, למשל Google Fonts.
- רשימה של קבוצות של גיבוב (hash) לאישורים, כדי לאמת את הזהות של הספק.
Kotlin
val request = FontRequest( "com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs )
Java
FontRequest request = new FontRequest("com.example.fontprovider", "com.example.fontprovider", "my font", certs);
- יוצרים מכונה של הכיתה
FontsContract.FontRequestCallback
. - משנים את השיטה
onTypefaceRetrieved()
כדי לציין שהבקשה לגבי הגופן הושלמה. מציינים את הגופן שאוחזר כפרמטר. אפשר להשתמש בשיטה הזו כדי להגדיר את הגופן לפי הצורך. לדוגמה, אפשר להגדיר את הגופן ב-TextView
. - כדי לקבל מידע על שגיאות בתהליך בקשת הגופן, צריך לשנות את השיטה
onTypefaceRequestFailed()
. מידע נוסף על קודי שגיאה זמין במאמר קבועים של קודי שגיאה. - קוראים לשיטה
FontsContract.requestFont()
כדי לאחזר את הגופן מספק הגופנים. ה-method מפעיל בדיקה כדי לקבוע אם הגופן קיים במטמון. אם הגופן לא זמין באופן מקומי, המערכת קוראת לספק הגופן, מאחזרת את הגופן באופן אסינכררוני ומעבירה את התוצאה לקריאה החוזרת. מעבירים את הפרמטרים הבאים:- מופע של
המחלקה
Context
- מופע של המחלקה
android.graphics.fonts.FontRequest
- קריאה חוזרת (callback) כדי לקבל את התוצאות של בקשת הגופן
- טיפול (handler) לאחזור גופנים בשרשור
- מופע של
המחלקה
הקוד לדוגמה הבא מדגים את התהליך הכולל של גופנים שניתן להורדה:
Kotlin
val request = FontRequest( "com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs ) val callback = object : FontsContract.FontRequestCallback() { override fun onTypefaceRetrieved(typeface: Typeface) { // Your code to use the font goes here. ... } override fun onTypefaceRequestFailed(reason: Int) { // Your code to deal with the failure goes here. ... } } FontsContract.requestFonts(context, request, handler, null, callback)
Java
FontRequest request = new FontRequest("com.example.fontprovider.authority", "com.example.fontprovider", "my font", certs); FontsContract.FontRequestCallback callback = new FontsContract.FontRequestCallback() { @Override public void onTypefaceRetrieved(Typeface typeface) { // Your code to use the font goes here. ... } @Override public void onTypefaceRequestFailed(int reason) { // Your code to deal with the failure goes here. ... } }; FontsContract.requestFonts(context, request, handler, null, callback);
למידע נוסף על הורדת גופן מספק גופנים, אפשר לעיין באפליקציית הדוגמה DownloadableFonts.
שימוש בגופנים שניתן להורדה עם AndroidX Core
AndroidX Core מספק תמיכה בתכונה 'גופנים שניתן להורדה' במכשירים עם Android API מגרסה 14 ואילך. החבילה androidx.core.provider
מכילה את המחלקות FontsContractCompat
ו-FontRequest
כדי להטמיע את התמיכה בתכונת הגופנים להורדה בהתאמה לאחור. הכיתות של AndroidX מכילות שיטות שדומות לשיטות של המסגרת, והתהליך להורדת גופנים דומה לתהליך שמתואר בקטע בדף הזה בנושא שימוש בגופנים שניתן להורדה באופן פרוגרמטי.
כדי להוריד גופנים באמצעות AndroidX, מייבאים את הכיתות FontsContractCompat
ו-FontRequest
מחבילת androidx.core.provider
. יוצרים מכונות של הכיתות האלה במקום כיתות המסגרת FontsContract
ו-android.graphics.fonts.FontRequest
.
הוספת יחסי תלות ל-AndroidX Core
כדי להשתמש בכיתות FontsContractCompat
ו-FontRequest
, צריך לשנות את יחסי התלות של classpath בפרויקט האפליקציה בסביבת הפיתוח.
כדי להוסיף את AndroidX Core לפרויקט האפליקציה, מוסיפים את התלות הבאה לקובץ build.gradle
של האפליקציה:
Groovy
dependencies { ... implementation "androidx.core:core-ktx:2.2.0" }
Kotlin
dependencies { ... implementation("androidx.core:core-ktx:2.2.0") }
שימוש בגופנים שניתנים להורדה כמשאבים ב-XML
ב-Android 8.0 (רמת API 26) וב-AndroidX Core יש דרך מהירה ונוחה יותר להצהיר על גופן מותאם אישית כמשאב בפריסה של ה-XML. כלומר, אין צורך לקבץ את הגופן כנכס. אתם יכולים להגדיר גופן מותאם אישית לכל העיצוב, וכך לשפר את נוחות השימוש במגוון משקלים וסגנונות, כמו מודגש, בינוני או בהיר, אם הם זמינים.
- יוצרים קובץ XML חדש בתיקייה
res/font
. - מוסיפים רכיב root מסוג
<font-family>
ומגדירים את המאפיינים הקשורים לגופן, כפי שמוצג בקובץ ה-XML לדוגמה הבא: - מציינים את הקובץ בתור
@font/font_file_name
בקובץ ה-XML של הפריסה. אפשר גם להשתמש ב-methodgetFont()
כדי לאחזר את הקובץ באופן פרוגרמטי, למשלgetFont(R.font.font_file_name)
.
<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android" android:fontProviderAuthority="com.example.fontprovider.authority" android:fontProviderPackage="com.example.fontprovider" android:fontProviderQuery="example font" android:fontProviderCerts="@array/certs"> </font-family>
הצהרת גופנים מראש במניפסט
הרחבת הפריסה ואחזור המשאבים הן משימות סינכרוניות. כברירת מחדל, הניסיון הראשון לאחזר גופנים מפעיל בקשה לספק הגופנים, ולכן משך הזמן של היצירה הראשונה של הפריסה ארוך יותר. כדי למנוע את העיכוב, אפשר להצהיר מראש על הגופנים שצריך לאחזר במניפסט. אחרי שהמערכת תאחזר את הגופן מהספק, הוא יהיה זמין מייד. אם אחזור הגופן נמשך יותר זמן מהצפוי, המערכת מפסיקה את תהליך האחזור ומשתמשת בגופן ברירת המחדל.
כדי להצהיר מראש על גופנים במניפסט:
- יוצרים מערך משאבים ב-
res/values/arrays.xml
ומצהירים על הגופנים שרוצים לאחזר מראש. - משתמשים בתג
meta-data
כדי להצהיר על מערך המשאבים במניפסט.
res/values/arrays.xml <?xml version="1.0" encoding="utf-8"?> <resources> <array name="preloaded_fonts"> <item>@font/font1</item> <item>@font/font2</item> </array> </resources>
<meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
הוספת אישורים
אם ספק הגופן לא מותקן מראש, או אם אתם משתמשים בספריית AndroidX Core, צריך להצהיר על האישורים שבהם נחתם ספק הגופן. המערכת משתמשת באישורים כדי לאמת את הזהות של ספק הגופן.
כדי להוסיף אישורים:
- יוצרים מערך מחרוזות עם פרטי האישור. למידע נוסף על פרטי האישור, אפשר לעיין במסמכי התיעוד של ספק הגופן.
- מגדירים את המאפיין
fontProviderCerts
למערך.
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array> </resources>
android:fontProviderCerts="@array/certs"