Typeface — τι είναι, τύποι γραμματοσειρών και εργασία στο Android

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-23 Χρόνος ανάγνωσης: 9 λεπ

Typeface — είναι μια κλάση Android SDK από το πακέτο android.graphics που αντιπροσωπεύει την όψη της γραμματοσειράς και χρησιμοποιείται για προσαρμογή κειμένου σε TextView και άλλα UI στοιχεία. Το Typeface καθορίζει την οικογένεια της γραμματοσειράς, το βάρος (normal, bold) και το στυλ (normal, italic). Σύμφωνα με το Google Developers, το Typeface υποστηρίζει φόρτωση από αρχεία TTF, OTF, XML γραμματοσειρές και πόρους συστήματος. Αυτή είναι η κεντρική κλάση για διαχείριση τυπογραφίας σε εφαρμογές Android.

Κύρια σημεία

  • Typeface — κλάση Android για αναπαράσταση όψης γραμματοσειράς με οικογένεια και στυλ
  • Ενσωματωμένα στυλ: Typeface.NORMAL, BOLD, ITALIC, BOLD_ITALIC
  • Οι γραμματοσειρές φορτώνονται από XML πόρους, αρχεία TTF/OTF, assets ή φακέλους συστήματος
  • Android 8.0+ υποστηρίζει φόρτωση γραμματοσειρών μέσω XML πόρων στο res/font
  • Typeface.create() δημιουργεί ένα στιγμιότυπο με καθορισμένη οικογένεια και στυλ

Τι είναι το Typeface;

Typeface — είναι μια κλάση Android που ενσωματώνει πληροφορίες σχετικά με τη γραμματοσειρά: την οικογένειά της (Roboto, Arial, Serif) και τους τροποποιητές στυλ (ένταση, πλάγια). Σε αντίθεση με το UIFont στο iOS, το Typeface δεν περιέχει πληροφορίες μεγέθους — το μέγεθος κειμένου ορίζεται ξεχωριστά μέσω της ιδιότητας textSize σε TextView ή TextStyle σε Spannable. Το Typeface είναι υπεύθυνο μόνο για την όψη και τη γραμματοσειρά.

Η κλάση είναι διαθέσιμη σε όλα τα επίπεδα API. Μέχρι το Android 4.4, το Typeface υποστήριζε μόνο περιορισμένο σύνολο γραμματοσειρών συστήματος: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. Από το Android 8.0 (API 26) προστέθηκε υποστήριξη για φόρτωση προσαρμοσμένων γραμματοσειρών μέσω XML πόρων, και το Android 10 πρόσθεσε υποστήριξη για μεταβλητές γραμματοσειρές.

Ενσωματωμένες σταθερές Typeface

Το Android παρέχει πολλά ενσωματωμένα στιγμιότυπα Typeface: Typeface.DEFAULT — γραμματοσειρά συστήματος Roboto (Material) ή Noto (AOSP), DEFAULT_BOLD — έντονη έκδοση, MONOSPACE — μονοδιάστητη γραμματοσειρά για κώδικα, SERIF — γραμματοσειρά με πατούρες (Noto Serif), SANS_SERIF — γραμματοσειρά χωρίς πατούρες (Noto Sans). Αυτές οι σταθερές είναι διαθέσιμες χωρίς περιβάλλον και δεν απαιτούν δικαιώματα ανάγνωσης αρχείων.

Typeface στο σύστημα

Το σύστημα Android χρησιμοποιεί Typeface για την απόδοση όλου του κειμένου, συμπεριλαμβανομένων UI συστήματος, επικεφαλίδων, ετικετών και ειδοποιήσεων. Κάθε εφαρμογή μπορεί να παρακάμψει την προεπιλεγμένη γραμματοσειρά μέσω θέματος (android:fontFamily) ή προγραμματιστικά μέσω setTypeface(). Το Typeface εφαρμόζεται σε όλα τα στοιχεία που κληρονομούν από TextView: κουμπιά, EditText και προσαρμοσμένες προβολές.

Δημιουργία Typeface από πόρους

Το Android 8.0+ επιτρέπει την προσθήκη γραμματοσειρών στο res/font και τη χρήση τους μέσω XML πόρων. Το αρχείο γραμματοσειράς (TTF ή OTF) τοποθετείται στο res/font, και στη συνέχεια δημιουργείται η αναφορά R.font.font_name. Το Typeface φορτώνεται μέσω ResourcesCompat.getFont(context, R.font.font_name). Αυτή η μέθοδος είναι προτιμότερη επειδή η γραμματοσειρά μεταγλωττίζεται στο APK και υποστηρίζει συστήματα διάταξης ProGuard.

Η μέθοδος πόρων υποστηρίζει επίσης οικογένειες γραμματοσειρών (font family) μέσω XML αρχείου στο res/font: μπορούν να καθοριστούν πολλαπλά αρχεία για διαφορετικές όψεις (regular, bold, italic) και το σύστημα θα επιλέξει αυτόματα το κατάλληλο αρχείο κατά την κλήση setTypeface. Αυτό απλοποιεί την τυπογραφία — αρκεί να ορίσετε το fontFamily στο θέμα, και το Android θα επιλέξει το κατάλληλο αρχείο.

Δημιουργία Typeface.create

Η μέθοδος Typeface.create(Typeface family, int style) δημιουργεί ένα στιγμιότυπο γραμματοσειράς με καθορισμένη οικογένεια και στυλ. Εάν η οικογένεια διαθέτει ήδη το ζητούμενο στυλ, επιστρέφεται το υπάρχον στιγμιότυπο. Εάν το στυλ δεν υπάρχει, το Android το συνθέτει — εφαρμόζει ψευδο-ένταση ή τεχνητή πλάγια γραφή στη βασική γραμματοσειρά.

kotlin
val boldTypeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD)
val italicTypeface = Typeface.create(Typeface.MONOSPACE, Typeface.ITALIC)
val customTypeface = ResourcesCompat.getFont(context, R.font.montserrat_regular)
textView.typeface = boldTypeface

Η συντιθέμενη ψευδο-ένταση μπορεί να φαίνεται χαμηλής ποιότητας σε λεπτές γραμματοσειρές. Για καλύτερο αποτέλεσμα, χρησιμοποιήστε αρχείο γραμματοσειράς με πραγματική bold όψη. Η Typeface.create() με ανύπαρκτο στυλ δεν ρίχνει εξαίρεση, αλλά επιστρέφει την πλησιέστερη διαθέσιμη παραλλαγή.

Typeface από αρχείο και assets

Για φόρτωση Typeface από assets χρησιμοποιείται η Typeface.createFromAsset(assetManager, path). Η γραμματοσειρά τοποθετείται στον κατάλογο src/main/assets/fonts/, και η διαδρομή καθορίζεται σχετικά με τα assets. Αυτή η μέθοδος λειτουργεί σε όλες τις εκδόσεις Android, αλλά δεν υποστηρίζει οικογένειες γραμματοσειρών και απαιτεί καθορισμό συγκεκριμένου αρχείου για κάθε όψη.

Η μέθοδος Typeface.createFromFile(File) φορτώνει γραμματοσειρά από οποιοδήποτε αρχείο στο σύστημα αρχείων. Αυτό είναι χρήσιμο για γραμματοσειρές που κατεβάζετε από το δίκτυο ή αντιγράφετε στην εσωτερική αποθήκευση της εφαρμογής. Η createFromFile δεν απαιτεί επίσης περιβάλλον, που είναι βολικό για εργασίες παρασκηνίου, αλλά το αρχείο πρέπει να είναι αναγνώσιμο.

Φόρτωση από assets με προσωρινή αποθήκευση

Η επαναλαμβανόμενη φόρτωση Typeface από assets μέσω createFromAsset μπορεί να οδηγήσει σε δημιουργία διπλότυπων αντικειμένων. Κάθε κλήση createFromAsset φορτώνει ξανά το αρχείο. Συνιστάται η υλοποίηση προσωρινής αποθήκευσης Typeface μέσω HashMap, όπου το κλειδί είναι η διαδρομή αρχείου και η τιμή είναι το φορτωμένο στιγμιότυπο. Αυτό είναι ιδιαίτερα σημαντικό για λίστες με διαφορετικούς τύπους γραμματοσειρών.

kotlin
object TypefaceCache {
    private val cache = mutableMapOf<String, Typeface>()
    fun getTypeface(context: Context, filename: String): Typeface {
        return cache.getOrPut(filename) {
            Typeface.createFromAsset(context.assets, "fonts/$filename")
        }
    }
}
// Χρήση
val typeface = TypefaceCache.getTypeface(context, "Roboto-Bold.ttf")

Η προσωρινή αποθήκευση στη μνήμη εγγυάται ότι μια γραμματοσειρά φορτώνεται μόνο μία φορά ανά συνεδρία εφαρμογής. Κατά την αλλαγή διαμόρφωσης (περιστροφή οθόνης), η προσωρινή αποθήκευση διατηρείται επειδή βρίσκεται στο αντικείμενο companion. Για καθαρισμό της προσωρινής αποθήκευσης σε έλλειψη μνήμης, χρησιμοποιήστε WeakHashMap ή παρακολουθήστε το onTrimMemory.

Εφαρμογή Typeface σε TextView

Το Typeface εφαρμόζεται σε TextView μέσω της μεθόδου setTypeface(Typeface tf) ή setTypeface(Typeface tf, int style). Η δεύτερη παραλλαγή επιτρέπει την αλλαγή στυλ (bold/italic) σε σχέση με την τρέχουσα γραμματοσειρά. Σε XML χρησιμοποιείται το χαρακτηριστικό android:fontFamily με αναφορά στη γραμματοσειρά ή οικογένεια συστήματος. Για προγραμματιστικό ορισμό, η κλήση setTypeface(monospaceTypeface) θα αντικαταστήσει τη γραμματοσειρά με την καθορισμένη.

Το Typeface επηρεάζει ολόκληρο το κείμενο του TextView. Εάν απαιτείται διαφορετική γραμματοσειρά σε μία γραμμή, χρησιμοποιείται SpannableString με TypefaceSpan. Το TypefaceSpan δέχεται Typeface ή family και εφαρμόζεται σε ένα εύρος χαρακτήρων. Αυτός είναι ο μόνος τρόπος ανάμειξης γραμματοσειρών μέσα σε ένα TextView χωρίς ένθετα στοιχεία.

TypefaceSpan για μέρος του κειμένου

Εφαρμόστε TypefaceSpan μόνο σε ένα μέρος της συμβολοσειράς. Για παράδειγμα, η τιμή μιας μεταβλητής στο κείμενο πρέπει να εμφανίζεται με μονοδιάστητη γραμματοσειρά, και το υπόλοιπο κείμενο με γραμματοσειρά συστήματος. Δημιουργείται ένα SpannableString, και στο επιθυμητό εύρος ορίζεται TypefaceSpan με MONOSPACE Typeface. Το υπόλοιπο κείμενο παραμένει με την αρχική γραμματοσειρά του TextView.

kotlin
val text = "Code: variableName"
val spannable = SpannableString(text)
spannable.setSpan(
    TypefaceSpan(Typeface.MONOSPACE),
    5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
    ForegroundColorSpan(Color.BLUE),
    5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable

Το κείμενο “variableName” θα εμφανιστεί με μονοδιάστητη γραμματοσειρά μπλε χρώματος, και η λέξη “Kod:” θα παραμείνει με γραμματοσειρά συστήματος. Το TypefaceSpan μπορεί να συνδυαστεί με οποιαδήποτε άλλα spans για ακριβή έλεγχο σε κάθε τμήμα κειμένου.

Προσαρμοσμένες γραμματοσειρές μέσω Typeface

Το Android υποστηρίζει διάφορες μορφές γραμματοσειρών: TrueType (TTF), OpenType (OTF) και Web Open Font Format (WOFF2) από Android 10. Τα TTF και OTF είναι οι κύριες μορφές για προσαρμοσμένες γραμματοσειρές. Οι XML γραμματοσειρές (Font Family) δεν είναι ξεχωριστή μορφή, αλλά χρησιμεύουν ως περιγραφή για το ποιο αρχείο να χρησιμοποιηθεί για κάθε όψη.

Για χρήση προσαρμοσμένης γραμματοσειράς μέσω res/font δημιουργήστε ένα XML αρχείο οικογένειας όπου καθορίζονται οι διαδρομές προς τα αρχεία γραμματοσειρών για regular, bold και italic. Στη συνέχεια, στο θέμα της εφαρμογής ορίστε android:fontFamily="@font/custom_family". Όλα τα TextView που χρησιμοποιούν αυτό το θέμα θα λάβουν αυτόματα τη σωστή όψη για κάθε στυλ.

Φόρτωση ληφθέντων γραμματοσειρών

Εάν η γραμματοσειρά κατεβαίνει από το δίκτυο, αποθηκεύστε την στο filesDir ή cacheDir και φορτώστε την μέσω Typeface.createFromFile. Μετά τη φόρτωση, ενημερώστε το Typeface στο TextView. Για ασύγχρονη φόρτωση χρησιμοποιήστε coroutine ή DownloadManager, και μετά την ολοκλήρωση, στείλτε στο νήμα UI μέσω Handler. Αυτό είναι τυπικό σενάριο για εφαρμογές με προσαρμοσμένη τυπογραφία που φορτώνεται κατόπιν ζήτησης.

kotlin
// Αποθήκευση αρχείου γραμματοσειράς στην εσωτερική μνήμη
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
    // ροή εισόδου από δίκτυο
    inputStream.copyTo(output)
}
// Δημιουργία Typeface από αρχείο
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface

Πριν από τη φόρτωση, ελέγξτε τη διαθεσιμότητα του αρχείου: εάν το αρχείο είναι κατεστραμμένο ή μη έγκυρο, η Typeface.createFromFile θα ρίξει RuntimeException. Συνιστάται να τυλίξετε την κλήση σε try-catch και σε περίπτωση σφάλματος να διατηρήσετε την προεπιλεγμένη γραμματοσειρά συστήματος.

Typeface στο Jetpack Compose

Στο Jetpack Compose, το Typeface Android SDK δεν χρησιμοποιείται άμεσα. Αντίθετα, το Compose παρέχει FontFamily και FontWeight για τυπογραφία. Το FontFamily φορτώνεται μέσω Font.Resource και Font.File. Το σύστημα τυπογραφίας του Compose ορίζεται μέσω MaterialTheme.typography, όπου σε κάθε στυλ (h1, body1, button) μπορεί να εκχωρηθεί προσαρμοσμένο FontFamily.

Για φόρτωση γραμματοσειράς από resources, το Compose χρησιμοποιεί Font(R.font.font_name, weight, style). Η γραμματοσειρά από assets φορτώνεται μέσω Font(assetPath = "fonts/custom.otf", weight, style). Μετά τον ορισμό της γραμματοσειράς, μεταβιβάζεται στο Typography και στη συνέχεια εφαρμόζεται μέσω MaterialTheme.typography.bodyLarge και παρόμοιων στυλ.

Μετατροπή Typeface σε γραμματοσειρά Compose

Εάν υπάρχει έτοιμο Typeface που δημιουργήθηκε μέσω Android SDK, μπορεί να χρησιμοποιηθεί στο Compose μέσω TypefaceAdapter ή με δημιουργία FontFamily βάσει Typeface. Για αυτό, λάβετε το Typeface από Typeface.create και μεταβιβάστε το σε FontFamily.Custom(listOf(Font(typeface))). Ωστόσο, συνιστάται η χρήση της εγγενούς προσέγγισης με Font.Resource, καθώς είναι καλύτερα βελτιστοποιημένη για Compose.

Απόδοση και προσωρινή αποθήκευση

Η φόρτωση γραμματοσειρών από αρχεία είναι μια δυνητικά δαπανηρή λειτουργία. Κάθε κλήση Typeface.createFromAsset ή Typeface.createFromFile διαβάζει το αρχείο από το δίσκο, το αναλύει και δημιουργεί ένα αντικείμενο Typeface. Για γραμματοσειρές μεγέθους 1-2 MB, αυτό διαρκεί 10-50 ms σε ψυχρή εκκίνηση. Η προσωρινή αποθήκευση Typeface είναι υποχρεωτική πρακτική για εφαρμογές με προσαρμοσμένες γραμματοσειρές.

Το Android SDK δεν αποθηκεύει προσωρινά γραμματοσειρές που δημιουργούνται μέσω createFromAsset ή createFromFile. Σε αντίθεση με τις γραμματοσειρές συστήματος που είναι προφορτωμένες στη διαδικασία Zygote, οι προσαρμοσμένες γραμματοσειρές φορτώνονται σε κάθε πρόσβαση. Συνιστάται η χρήση LruCache ή ConcurrentHashMap με κλειδί από το αναγνωριστικό γραμματοσειράς. Μέγεθος προσωρινής αποθήκευσης — 10-20 στιγμιότυπα, που καλύπτει το τυπικό σύνολο γραμματοσειρών της εφαρμογής.

Βελτιστοποίηση μέσω Font Family (API 26+)

Το Android 8.0+ βελτιστοποιεί τη φόρτωση γραμματοσειρών μέσω XML Font Family. Κατά τον καθορισμό android:fontFamily="@font/my_family" στη διάταξη XML, το Android φορτώνει τη γραμματοσειρά τεμπέλικα — μόνο όταν το στοιχείο γίνει ορατό. Το σύστημα αποθηκεύει επίσης προσωρινά γραμματοσειρές που φορτώνονται μέσω ResourcesCompat.getFont() στην καθολική προσωρινή αποθήκευση της διεργασίας. Αυτό καθιστά τη μέθοδο πόρων την πιο αποδοτική.

Typeface στο RecyclerView

Κατά τη χρήση Typeface σε προσαρμογείς RecyclerView είναι σημαντικό να μην φορτώνετε τη γραμματοσειρά στη μέθοδο onBindViewHolder. Καλέστε τη φόρτωση μία φορά κατά τη δημιουργία του προσαρμογέα ή χρησιμοποιήστε ViewHolder με προφορτωμένο Typeface. Εάν κάθε στοιχείο λίστας απαιτεί μοναδική γραμματοσειρά, υλοποιήστε προσωρινή αποθήκευση μέσω WeakHashMap και καθαρίστε την κατά την κύλιση πέρα από ορατές θέσεις για εξοικονόμηση μνήμης.

Συχνές ερωτήσεις

Ποια είναι η διαφορά μεταξύ Typeface και FontFamily στο Android;

Typeface — είναι ένα συγκεκριμένο στιγμιότυπο γραμματοσειράς για προγραμματιστική χρήση. FontFamily — ένας XML πόρος που περιγράφει μια ομάδα αρχείων γραμματοσειράς για διαφορετικές όψεις (regular, bold, italic). Κατά το χρόνο εκτέλεσης, το FontFamily μετατρέπεται σε Typeface μέσω ResourcesCompat.getFont. Το Typeface μπορεί να δημιουργηθεί απευθείας από αρχείο, παρακάμπτοντας το FontFamily.

Πώς να φορτώσω Typeface χωρίς περιβάλλον;

Χρησιμοποιήστε Typeface.createFromFile(File) ή Typeface.DEFAULT. Αυτές οι μέθοδοι δεν απαιτούν περιβάλλον, επειδή λειτουργούν με το σύστημα αρχείων ή ενσωματωμένες σταθερές. Για φόρτωση από assets ή πόρους, το περιβάλλον είναι υποχρεωτικό, καθώς απαιτείται πρόσβαση στο AssetManager και τους πόρους της εφαρμογής.

Μπορεί να χρησιμοποιηθεί το Typeface σε WebView;

Όχι, το WebView χρησιμοποιεί την ιδιότητα CSS font-family για τον καθορισμό γραμματοσειρών. Για να χρησιμοποιήσετε προσαρμοσμένη γραμματοσειρά σε WebView, τοποθετήστε το αρχείο γραμματοσειράς στα assets και καθορίστε το μέσω @font-face στο CSS. Το Typeface Android SDK λειτουργεί μόνο με εγγενή UI στοιχεία (TextView και τους απογόνους του).

Υποστηρίζει το Typeface μεταβλητές γραμματοσειρές;

Ναι, από Android 10 (API 29). Οι μεταβλητές γραμματοσειρές φορτώνονται μέσω ResourcesCompat.getFont ή Typeface.createFromFile. Για ρύθμιση αξόνων μεταβλητότητας (weight, width) χρησιμοποιείται FontStyle σε Compose ή XML χαρακτηριστικά. Ο προγραμματιστικός αλλαγή άξονα είναι δυνατή μόνο μέσω του χαμηλού επιπέδου API Skia.

Γιατί η setTypeface δεν λειτουργεί για ορισμένες γραμματοσειρές;

Οι πιο συχνές αιτίες: το αρχείο γραμματοσειράς λείπει από το έργο, έχει καθοριστεί λανθασμένο όνομα αρχείου, η γραμματοσειρά είναι κατεστραμμένη ή χρησιμοποιείται συντιθέμενο στυλ που δεν υπάρχει στο αρχείο. Ελέγξτε ότι το αρχείο έχει προστεθεί στο res/font ή assets και ότι το όνομά του καθορίζεται χωρίς επέκταση στην περίπτωση της μεθόδου πόρων.

Περίληψη

  • Typeface — κλάση Android για αναπαράσταση γραμματοσειράς με οικογένεια και στυλ όψης
  • Ενσωματωμένες σταθερές: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF
  • Φόρτωση μέσω ResourcesCompat.getFont, Typeface.createFromAsset, createFromFile
  • XML Font Family (API 26+) — προτιμώμενη μέθοδος για προσαρμοσμένες γραμματοσειρές
  • TypefaceSpan επιτρέπει την εφαρμογή γραμματοσειράς σε μέρος κειμένου μέσω SpannableString
  • Προσωρινή αποθήκευση Typeface είναι υποχρεωτική — χρησιμοποιήστε HashMap ή LruCache
  • Στο Compose χρησιμοποιήστε FontFamily και FontWeight αντί για Typeface Android SDK

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης