Trang này mô tả cách bạn có thể định kiểu văn bản cho đoạn văn. Để đặt kiểu ở cấp đoạn văn, bạn có thể định cấu hình các tham số như textAlign và lineHeight hoặc xác định ParagraphStyle của riêng mình.
Đặt chế độ căn chỉnh văn bản
Tham số textAlign cho phép bạn đặt chế độ căn chỉnh ngang
căn chỉnh của
văn bản trong một phạm vi nền tảng thành phần kết hợp Text.
Theo mặc định, Text sẽ chọn cách căn chỉnh văn bản tự nhiên tuỳ thuộc vào giá trị nội dung nó:
- Cạnh trái của vùng chứa
Textdành cho các bảng chữ cái từ trái sang phải, chẳng hạn như chữ La tinh, Cyrillic hoặc Hangul - Cạnh phải của vùng chứa
Textdành cho các bảng chữ cái từ phải sang trái, chẳng hạn như chữ Ả Rập hoặc chữ Do Thái
@Composable fun CenterText() { Text( "Hello World", textAlign = TextAlign.Center, modifier = Modifier.width(150.dp) ) }
Nếu bạn muốn đặt chế độ căn chỉnh văn bản theo cách thủ công cho thành phần kết hợp Text, hãy ưu tiên
sử dụng TextAlign.Start và TextAlign.End thay vì TextAlign.Left và
TextAlign.Right do chúng sẽ phân giải ở cạnh bên phải của thành phần kết hợp Text
tuỳ vào hướng văn bản bằng ngôn ngữ được ưu tiên. Ví dụ: TextAlign.End căn chỉnh ở bên phải cho văn bản tiếng Pháp và bên trái cho văn bản tiếng Ả Rập, nhưng TextAlign.Right sẽ căn chỉnh bên phải cho dù bạn sử dụng bảng chữ cái nào.
Thêm nhiều kiểu trong một đoạn văn
Để thêm nhiều kiểu trong một đoạn văn, bạn có thể sử dụng ParagraphStyle trong an
AnnotatedString, có thể được chú thích theo kiểu tuỳ ý.
Khi một phần văn bản được đánh dấu bằng ParagraphStyle, phần đó sẽ được tách ra khỏi phần văn bản còn lại như thể nó có chuyển dòng ở đầu và cuối.
Để biết thêm thông tin về cách thêm nhiều kiểu trong một văn bản, hãy xem bài viết Thêm nhiều kiểu trong văn bản.
AnnotatedString có trình tạo
loại an toàn
để dễ dàng tạo: buildAnnotatedString. Đoạn mã sau sử dụng buildAnnotatedString để đặt ParagraphStyle:
@Composable fun ParagraphStyle() { Text( buildAnnotatedString { withStyle(style = ParagraphStyle(lineHeight = 30.sp)) { withStyle(style = SpanStyle(color = Color.Blue)) { append("Hello\n") } withStyle( style = SpanStyle( fontWeight = FontWeight.Bold, color = Color.Red ) ) { append("World\n") } append("Compose") } } ) }
Điều chỉnh chiều cao dòng và khoảng đệm
includeFontPadding là một thuộc tính cũ bổ sung thêm khoảng đệm dựa trên chỉ số phông chữ ở đầu dòng đầu tiên và cuối dòng cuối cùng của văn bản.
Kể từ phiên bản BOM Compose 2024.01.01, includeFontPadding được đặt
thành false theo mặc định, giúp bố cục văn bản mặc định phù hợp hơn với
các công cụ thiết kế thông thường.
Tính năng định cấu hình lineHeight không còn mới – đã có kể từ Android Q. Bạn có thể định cấu hình lineHeight cho Text bằng cách sử dụng tham số lineHeight. Tham số này sẽ phân bổ chiều cao dòng trong mỗi dòng văn bản. Sau đó, bạn có thể dùng LineHeightStyle API mới để định cấu hình thêm
cách căn chỉnh văn bản này trong khoảng trống và xoá khoảng trắng.
Bạn có thể cần điều chỉnh lineHeight bằng cách sử dụng đơn vị văn bản "em" (cỡ chữ tương đối) thay vì "sp" (pixel theo tỷ lệ) để tăng độ chính xác. Để biết thêm thông tin về
cách chọn đơn vị văn bản thích hợp, hãy xem TextUnit.
lineHeight đã đặt và cắt bớt khoảng trống thừa nếu cần.
Text( text = text, style = LocalTextStyle.current.merge( TextStyle( lineHeight = 2.5.em, platformStyle = PlatformTextStyle( includeFontPadding = false ), lineHeightStyle = LineHeightStyle( alignment = LineHeightStyle.Alignment.Center, trim = LineHeightStyle.Trim.None ) ) ) )
Ngoài việc điều chỉnh lineHeight, giờ đây, bạn có thể tiếp tục căn giữa và tạo kiểu cho văn bản
bằng cách sử dụng các cấu hình với LineHeightStyle API: LineHeightStyle.Alignment
và LineHeightStyle.Trim (includeFontPadding phải được đặt thành false để
tính năng Cắt bỏ hoạt động). Tính năng Căn chỉnh và Cắt bỏ sử dụng khoảng trống đo được giữa các dòng văn bản để phân bổ phù hợp hơn cho tất cả các dòng – bao gồm cả một dòng văn bản và dòng trên cùng của khối văn bản.
LineHeightStyle.Alignment xác định cách căn chỉnh dòng trong khoảng trống được cung cấp theo chiều cao của dòng. Trong mỗi dòng, bạn có thể căn chỉnh để văn bản hiện trên cùng, dưới cùng, ở giữa hoặc theo tỷ lệ. Sau đó, LineHeightStyle.Trim sẽ cho phép bạn để lại hoặc xoá khoảng trống thừa ở đầu dòng đầu tiên và cuối dòng cuối cùng của văn bản, được tạo từ bất kỳ thao tác điều chỉnh nào dùng lineHeight và tính năng Căn chỉnh. Sau đây là các ví dụ minh hoạ văn bản nhiều dòng với các cấu hình LineHeightStyle.Trim khác nhau khi căn chỉnh ở giữa (LineHeightStyle.Alignment.Center).
![]() |
![]() |
LineHeightStyle.Trim.None |
LineHeightStyle.Trim.Both |
![]() |
![]() |
LineHeightStyle.Trim.FirstLineTop |
LineHeightStyle.Trim.LastLineBottom |
Hãy xem bài đăng trên blog về Khắc phục khoảng đệm phông chữ trong văn bản Compose để tìm hiểu
thêm về ngữ cảnh của thay đổi này, cách includeFontPadding hoạt động trong hệ thống Khung hiển thị, những thay đổi mà chúng tôi đã thực hiện đối với Compose và các LineHeightStyle
API mới.
Chèn dấu ngắt dòng
API xác định các tiêu chí để chia văn bản thành nhiều dòng.LineBreak Bạn có thể chỉ định loại ngắt dòng mà bạn muốn trong khối
TextStyle của thành phần kết hợp Text. Các loại ngắt dòng đặt sẵn bao gồm:
Simple– Ngắt dòng cơ bản, nhanh. Khuyên dùng cho các trường nhập văn bản.Heading– Ngắt dòng với các quy tắc ngắt dòng ít nghiêm ngặt hơn. Khuyên dùng cho văn bản ngắn, chẳng hạn như tiêu đề.Paragraph– Ngắt dòng chậm hơn, chất lượng cao hơn để cải thiện khả năng đọc. Khuyên dùng cho lượng văn bản lớn hơn, chẳng hạn như đoạn văn.
Đoạn mã sau sử dụng cả Simple và Paragraph để chỉ định hành vi ngắt dòng trên một khối văn bản dài:
TextSample( samples = mapOf( "Simple" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Simple ) ) }, "Paragraph" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph ) ) } ) )
Trong kết quả ở trên, hãy lưu ý rằng hành vi ngắt dòng Paragraph tạo ra kết quả cân bằng hơn về mặt hình ảnh so với hành vi ngắt dòng Simple.
Tuỳ chỉnh dấu ngắt dòng
Bạn cũng có thể tạo cấu hình LineBreak của riêng mình bằng tham số Strategy. Strategy có thể là một trong những giá trị sau:
Balanced– Cố gắng cân bằng độ dài dòng của văn bản, đồng thời áp dụng tính năng tự động gạch nối nếu được bật. Khuyên dùng cho màn hình nhỏ, như đồng hồ, để tối đa hoá lượng văn bản hiển thị.HighQuality– Tối ưu hoá một đoạn văn để văn bản dễ đọc hơn, bao gồm cả tính năng gạch nối nếu được bật. (Đây phải là giá trị mặc định cho mọi thứ không phải làBalancedhoặcSimple.)Simple– chiến lược cơ bản, nhanh. Nếu được bật, tính năng gạch nối chỉ được thực hiện cho những từ không vừa với toàn bộ dòng. Hữu ích cho việc chỉnh sửa văn bản để tránh thay đổi vị trí khi nhập.
Đoạn mã sau đây cho thấy sự khác biệt giữa một đoạn văn có chế độ cài đặt mặc định và một đoạn văn được tối ưu hoá cho màn hình nhỏ bằng chiến lược ngắt dòng Balanced:
TextSample( samples = mapOf( "Balanced" to { val smallScreenAdaptedParagraph = LineBreak.Paragraph.copy(strategy = LineBreak.Strategy.Balanced) Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(200.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = smallScreenAdaptedParagraph ) ) }, "Default" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(200.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default ) } ) )
Balanced (trên cùng) so với một đoạn văn được định dạng mà không có chiến lược ngắt dòng.Những điểm cần lưu ý về CJK
Bạn cũng có thể tuỳ chỉnh LineBreak bằng các API Strictness và
WordBreak. Các API này được thiết kế riêng cho các ngôn ngữ CJK.
Bạn có thể không phải lúc nào cũng thấy hiệu ứng của các API này trong các ngôn ngữ không phải CJK. Nhìn chung, các quy tắc ngắt dòng được xác định dựa trên ngôn ngữ.
Strictness mô tả mức độ nghiêm ngặt của việc ngắt dòng với các thuộc tính sau:
Default– Quy tắc ngắt dòng mặc định cho ngôn ngữ. Có thể tương ứng vớiNormalhoặcStrict.Loose– Các quy tắc ít hạn chế nhất. Phù hợp với các dòng ngắn.Normal– Các quy tắc phổ biến nhất để ngắt dòng.Strict– Các quy tắc nghiêm ngặt nhất để ngắt dòng.
WordBreak xác định cách chèn dấu ngắt dòng trong các từ có các thuộc tính sau:
Default– Quy tắc ngắt dòng mặc định cho ngôn ngữ.Phrase– Việc ngắt dòng dựa trên cụm từ.
Đoạn mã sau sử dụng mức độ nghiêm ngặt Strict và chế độ cài đặt ngắt từ Phrase cho văn bản tiếng Nhật:
val customTitleLineBreak = LineBreak( strategy = LineBreak.Strategy.HighQuality, strictness = LineBreak.Strictness.Strict, wordBreak = LineBreak.WordBreak.Phrase ) Text( text = "あなたに寄り添う最先端のテクノロジー。", modifier = Modifier.width(250.dp), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = customTitleLineBreak ) )
Strictness và WordBreak (trên cùng) so với văn bản chỉ được định dạng bằng LineBreak.Heading (dưới cùng).Gạch nối văn bản được chia thành nhiều dòng
Hyphens API cho phép bạn thêm tính năng hỗ trợ gạch nối vào ứng dụng.
Tính năng gạch nối đề cập đến việc chèn dấu chấm câu giống như dấu gạch ngang để cho biết một
từ được chia thành nhiều dòng văn bản. Khi được bật, tính năng gạch nối sẽ được thêm vào giữa các âm tiết của một từ tại các điểm gạch nối thích hợp.
Theo mặc định, tính năng gạch nối không được bật. Để bật tính năng gạch nối, hãy thêm Hyphens.Auto làm tham số trong khối TextStyle:
TextSample( samples = mapOf( "Hyphens - None" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph, hyphens = Hyphens.None ) ) }, "Hyphens - Auto" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph, hyphens = Hyphens.Auto ) ) } ) )
Khi được bật, tính năng gạch nối chỉ xảy ra trong các điều kiện sau:
- Một từ không vừa với một dòng. Nếu bạn sử dụng chiến lược ngắt dòng
Simple, thì tính năng gạch nối của một từ chỉ xảy ra nếu một dòng ngắn hơn từ đó. - Ngôn ngữ thích hợp được đặt trên thiết bị của bạn, vì tính năng gạch nối thích hợp được xác định bằng cách sử dụng các từ điển có trên hệ thống.
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Định kiểu văn bản
- Kiến thức cơ bản về bố cục Compose
- Phép đo nội tại trong bố cục Compose



