Trang này mô tả cách đặt phông chữ trong ứng dụng Compose.
Đặt phông chữ
Text
có một thông số fontFamily
để cho phép cài đặt phông chữ được dùng trong
thành phần kết hợp. Theo mặc định, bộ phông chữ serif, sans-serif, phông chữ đơn cách và chữ viết tay
được bao gồm:
@Composable fun DifferentFonts() { Column { Text("Hello World", fontFamily = FontFamily.Serif) Text("Hello World", fontFamily = FontFamily.SansSerif) } }
Bạn có thể sử dụng thuộc tính fontFamily
để làm việc với các phông chữ và kiểu chữ tuỳ chỉnh được xác định trong thư mục res/font
:
Ví dụ này cho thấy cách bạn xác định fontFamily
dựa trên các tệp phông chữ đó và sử dụng hàm Font
:
val firaSansFamily = FontFamily( Font(R.font.firasans_light, FontWeight.Light), Font(R.font.firasans_regular, FontWeight.Normal), Font(R.font.firasans_italic, FontWeight.Normal, FontStyle.Italic), Font(R.font.firasans_medium, FontWeight.Medium), Font(R.font.firasans_bold, FontWeight.Bold) )
Bạn có thể truyền fontFamily
này đến thành phần kết hợp Text
. Vì một
fontFamily
có thể bao gồm nhiều trọng số, bạn có thể đặt fontWeight
thành
chọn độ đậm phù hợp cho văn bản:
Column { Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Light) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal) Text( text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal, fontStyle = FontStyle.Italic ) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Medium) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Bold) }
Để tìm hiểu cách thiết lập kiểu chữ trong toàn bộ ứng dụng, hãy xem bài viết Hệ thống thiết kế tuỳ chỉnh trong Compose.
Phông chữ có thể tải xuống
Bắt đầu trong Compose 1.2.0, bạn có thể dùng API phông chữ có thể tải xuống trong ứng dụng Compose để tải Google phông chữ không đồng bộ và sử dụng các phông chữ này trong ứng dụng của bạn.
Hiện tại, chúng tôi không hỗ trợ phông chữ có thể tải xuống do nhà cung cấp tuỳ chỉnh cung cấp.
Sử dụng phông chữ có thể tải xuống theo phương thức lập trình
Để tải phông chữ theo phương thức lập trình trong ứng dụng, hãy làm theo các bước sau:
- Thêm phần phụ thuộc:
Groovy
dependencies { ... implementation "androidx.compose.ui:ui-text-google-fonts:1.7.0" }
Kotlin
dependencies { ... implementation("androidx.compose.ui:ui-text-google-fonts:1.7.0") }
- Khởi động
GoogleFont.Provider
bằng thông tin đăng nhập Google Fonts: Các tham số mà nhà cung cấp nhận được là:val provider = GoogleFont.Provider( providerAuthority = "com.google.android.gms.fonts", providerPackage = "com.google.android.gms", certificates = R.array.com_google_android_gms_fonts_certs )
- Nhà cung cấp phông chữ cho Google Fonts.
- Gói trình cung cấp phông chữ để xác minh danh tính của trình cung cấp
- Danh sách tập hợp hàm băm cho các chứng chỉ để xác minh danh tính của trình cung cấp. Bạn có thể tìm thấy các hàm băm bắt buộc cho trình cung cấp Google Fonts
trong tệp
font_certs.xml
trong Ứng dụng mẫu Jetchat.
- Xác định
FontFamily
: Bạn có thể truy vấn các tham số khác cho phông chữ như độ đậm và kiểu bằng// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider) )
FontWeight
vàFontStyle
tương ứng:// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font( googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold, style = FontStyle.Italic ) )
- Định cấu hình để
FontFamily
trở thành dùng trong hàm có khả năng kết hợp Văn bản:
Text( fontFamily = fontFamily, text = "Hello World!" )
Bạn cũng có thể xác định
Kiểu chữ nên sử dụng
FontFamily
của bạn:
val MyTypography = Typography( bodyMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Normal, fontSize = 12.sp/*...*/ ), bodyLarge = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Bold, letterSpacing = 2.sp, /*...*/ ), headlineMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.SemiBold/*...*/ ), /*...*/ )
Tiếp theo, hãy đặt Kiểu chữ thành giao diện của ứng dụng:
MyAppTheme( typography = MyTypography )/*...*/
Ví dụ về một ứng dụng đang triển khai phông chữ có thể tải xuống trong Compose cùng với Material3, hãy xem ứng dụng mẫu Jetchat.
Thêm phông chữ dự phòng
Bạn có thể xác định một chuỗi dự phòng cho phông chữ của mình trong trường hợp phông chữ không thể tải xuống chính xác. Ví dụ: nếu bạn có phông chữ có thể tải xuống được xác định như sau:
// ... import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold) )
Bạn có thể xác định giá trị mặc định cho phông chữ với cả hai trọng số như sau:
// ... import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(resId = R.font.my_font_regular), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold), Font(resId = R.font.my_font_regular_bold, weight = FontWeight.Bold) )
Hãy nhớ thêm chính xác dữ liệu nhập.
Việc xác định FontFamily
như thế này sẽ tạo ra một FontFamily
chứa hai chuỗi, mỗi trọng số một chuỗi. Cơ chế tải sẽ cố gắng giải quyết phông chữ trực tuyến trước,
rồi phông chữ nằm trong thư mục tài nguyên R.font
cục bộ.
Gỡ lỗi triển khai
Để xác minh liệu phông chữ có được tải xuống chính xác hay không, bạn cần xác định một trình xử lý coroutine gỡ lỗi. Trình xử lý của bạn cung cấp hành vi của việc cần làm trong trường hợp phông chữ không tải không đồng bộ được.
Hãy bắt đầu bằng cách tạo một
CoroutineExceptionHandler
:
val handler = CoroutineExceptionHandler { _, throwable -> // process the Throwable Log.e(TAG, "There has been an issue: ", throwable) }
Chuyển đến
createFontFamilyResolver
để yêu cầu trình phân giải sử dụng trình xử lý mới:
CompositionLocalProvider( LocalFontFamilyResolver provides createFontFamilyResolver(LocalContext.current, handler) ) { Column { Text( text = "Hello World!", style = MaterialTheme.typography.bodyMedium ) } }
Bạn cũng có thể sử dụng API isAvailableOnDevice
của nhà cung cấp để kiểm tra xem họ có sẵn không và các chứng chỉ có được định cấu hình chính xác hay không. Để thực hiện việc này, bạn có thể gọi phương thức isAvailableOnDevice
trả về false nếu trình cung cấp được định cấu hình không đúng.
val context = LocalContext.current LaunchedEffect(Unit) { if (provider.isAvailableOnDevice(context)) { Log.d(TAG, "Success!") } }
Chú ý
Google Fonts mất vài tháng để cung cấp phông chữ mới trên Android.
Có một khoảng thời gian giữa thời điểm thêm phông chữ
fonts.google.com và thời điểm dịch vụ này được cung cấp qua
API phông chữ có thể tải xuống (trong hệ thống Khung hiển thị hoặc trong Compose). Mới
phông chữ đã thêm có thể không tải được trong ứng dụng của bạn với
IllegalStateException
.
Để giúp nhà phát triển xác định lỗi này so với các loại lỗi tải phông chữ khác,
chúng tôi đã thêm thông báo mô tả cho trường hợp ngoại lệ trong Compose cùng với các thay đổi
tại đây.
Nếu bạn phát hiện thấy bất kỳ vấn đề nào, hãy báo cáo bằng cách sử dụng vấn đề đó
công cụ theo dõi.
Sử dụng phông chữ có thể thay đổi
Phông chữ có thể thay đổi là định dạng phông chữ cho phép một tệp phông chữ chứa các nội dung khác nhau kiểu. Với phông chữ thay đổi, bạn có thể sửa đổi trục (hoặc thông số) để tạo phong cách mà bạn ưa thích. Các trục này có thể là trục chuẩn, chẳng hạn như trọng lượng, chiều rộng, độ xiên, và in nghiêng hoặc tuỳ chỉnh, khác nhau giữa các phông chữ thay đổi.
Bằng cách sử dụng phông chữ biến đổi thay vì tệp phông chữ thông thường, bạn chỉ có một phông chữ thay vì nhiều tệp phông chữ.
Để biết thêm thông tin cơ bản về các phông chữ có thể thay đổi, hãy xem bài viết Google Fonts Kiến thức, toàn bộ danh mục của và bảng các trục được hỗ trợ cho mỗi phông chữ của bạn.
Tài liệu này hướng dẫn bạn cách triển khai một phông chữ có thể thay đổi trong ứng dụng Compose.
Tải phông chữ có thể thay đổi
Tải xuống phông chữ biến mà bạn muốn sử dụng (ví dụ: Roboto Flex) và đặt nó vào thư mục
app/res/font
trong ứng dụng của bạn. Hãy đảm bảo rằng tệp .ttf
tệp bạn thêm vào là phiên bản phông chữ biến thể của phông chữ và tên của tệp phông chữ của bạn hoàn toàn là chữ thường và không chứa bất kỳ ký tự đặc biệt nào.Để tải phông chữ có thể thay đổi, hãy xác định
FontFamily
bằng cách sử dụng phông chữ được đặt trong Thư mụcres/font/
:// In Typography.kt @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) )
API
FontVariation
cho phép bạn định cấu hình các trục phông chữ chuẩn như trọng số, chiều rộng và độ nghiêng. Đây là các trục tiêu chuẩn có sẵn với bất kỳ phông chữ biến đổi nào. Bạn có thể tạo các cấu hình khác nhau của dựa vào vị trí phông chữ sẽ được sử dụng.Phông chữ biến chỉ có sẵn cho Android phiên bản O trở lên, vì vậy, hãy thêm lan can và định cấu hình một biện pháp dự phòng thích hợp:
// In Typography.kt val default = FontFamily( /* * This can be any font that makes sense */ Font( R.font.robotoflex_static_regular ) ) @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) ) } else { default }
Trích xuất các chế độ cài đặt thành một tập hợp các hằng số để dễ sử dụng lại và thay thế chế độ cài đặt phông chữ với các hằng số sau:
// VariableFontDimension.kt object DisplayLargeVFConfig { const val WEIGHT = 950 const val WIDTH = 30f const val SLANT = -6f const val ASCENDER_HEIGHT = 800f const val COUNTER_WIDTH = 500 } @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ) ) ) } else { default }
Định cấu hình kiểu chữ Material Design 3 để sử dụng
FontFamily
:// Type.kt val Typography = Typography( displayLarge = TextStyle( fontFamily = displayLargeFontFamily, fontSize = 50.sp, lineHeight = 64.sp, letterSpacing = 0.sp, /***/ ) )
Mẫu này sử dụng
displayLarge
Kiểu chữ Material 3, có nhiều chế độ cài đặt phông chữ mặc định và cách sử dụng được đề xuất. Ví dụ: bạn nên sử dụngdisplayLarge
cho văn bản ngắn và quan trọng, vì đây là văn bản lớn nhất trên màn hình.Với Material 3, bạn có thể thay đổi các giá trị mặc định của
TextStyle
vàfontFamily
để tuỳ chỉnh kiểu chữ. Trong đoạn mã trên, bạn định cấu hình các thực thể củaTextStyle
để tuỳ chỉnh chế độ cài đặt phông chữ cho từng bộ phông chữ.Bây giờ, bạn đã xác định được kiểu chữ, hãy truyền kiểu chữ đó vào
MaterialTheme
của M3:MaterialTheme( colorScheme = MaterialTheme.colorScheme, typography = Typography, content = content )
Cuối cùng, hãy sử dụng thành phần kết hợp
Text
và chỉ định kiểu cho một trong các kiểu chữ được xác định,MaterialTheme.typography.displayLarge
:@Composable @Preview fun CardDetails() { MyCustomTheme { Card( shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Column( modifier = Modifier.padding(16.dp) ) { Text( text = "Compose", style = MaterialTheme.typography.displayLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 1 ) Text( text = "Beautiful UIs on Android", style = MaterialTheme.typography.headlineMedium, modifier = Modifier.padding(bottom = 8.dp), maxLines = 2 ) Text( text = "Jetpack Compose is Android’s recommended modern toolkit for building native UI. It simplifies and accelerates UI development on Android. Quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.", style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 3 ) } } } }
Mỗi thành phần kết hợp
Text
được định cấu hình thông qua kiểu và giao diện Material có chứa cấu hình phông chữ biến khác. Bạn có thể sử dụngMaterialTheme.typography
để truy xuất kiểu chữ được cung cấp cho M3 Thành phần kết hợpMaterialTheme
.
Sử dụng trục tuỳ chỉnh
Phông chữ cũng có thể có các trục tuỳ chỉnh. Các thuộc tính này được xác định trong chính tệp phông chữ.
Ví dụ: phông chữ Roboto Flex có trục chiều cao chữ cái viết thường ("YTAS"
) giúp điều chỉnh chiều cao của chữ cái viết thường, trong khi chiều rộng bộ đếm ("XTRA"
) điều chỉnh chiều rộng của từng chữ cái.
Bạn có thể thay đổi giá trị của các trục này bằng chế độ cài đặt FontVariation
.
Để biết thêm thông tin về các trục tuỳ chỉnh mà bạn có thể định cấu hình cho phông chữ, hãy xem bảng các trục được hỗ trợ cho mỗi phông chữ.
Để sử dụng trục tuỳ chỉnh, hãy xác định các hàm cho
ascenderHeight
tuỳ chỉnh và TrụccounterWidth
:fun ascenderHeight(ascenderHeight: Float): FontVariation.Setting { require(ascenderHeight in 649f..854f) { "'Ascender Height' must be in 649f..854f" } return FontVariation.Setting("YTAS", ascenderHeight) } fun counterWidth(counterWidth: Int): FontVariation.Setting { require(counterWidth in 323..603) { "'Counter width' must be in 323..603" } return FontVariation.Setting("XTRA", counterWidth.toFloat()) }
Các hàm này thực hiện những việc sau:
- Xác định các giới hạn an toàn cho các giá trị mà chúng có thể chấp nhận. Như bạn có thể thấy trong
Danh mục phông chữ thay đổi,
ascenderHeight (YTAS)
có một giá trị tối thiểu là649f
và lớn nhất là854f
. - Trả về chế độ cài đặt phông chữ để cấu hình sẵn sàng thêm vào phông chữ. Ngang bằng
phương thức
FontVariation.Setting()
, tên trục (YTAS, XTRA
) là được cố định giá trị trong mã và nhận giá trị làm tham số.
- Xác định các giới hạn an toàn cho các giá trị mà chúng có thể chấp nhận. Như bạn có thể thấy trong
Danh mục phông chữ thay đổi,
Sử dụng các trục cùng với cấu hình phông chữ, truyền các tham số bổ sung tới mỗi
Font
được tải:@OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ascenderHeight(DisplayLargeVFConfig.ASCENDER_HEIGHT), counterWidth(DisplayLargeVFConfig.COUNTER_WIDTH) ) ) ) } else { default }
Lưu ý rằng chiều cao của phần đuôi viết thường hiện đã tăng lên và văn bản khác rộng hơn:
Tài nguyên khác
Để biết thêm thông tin, hãy xem bài đăng trên blog sau đây về phông chữ thay đổi:
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Tài nguyên trong Compose
- Định kiểu văn bản
- Material Design 2 trong Compose