Hiển thị text là một nhiệm vụ rất quan trọng trong hầu hết các apps, vì thế nên trên Android Q tiếp tục được giới thiệu nhiều tính năng mới để hỗ trợ và cải thiện performance cho việc này. Chúng tôi đã tắt tính năng gạch nối mặc định, cho phép tạo kiểu chữ bằng nhiều phông chữ hoặc họ phông chữ, hiển thị danh sách phông chữ được cài đặt trên thiết bị và cải thiện một số API kiểu văn bản được sử dụng nhiều nhất.

Dấu gạch nối (hyphenation) bị tắt theo mặc định trong Android Q và AppCompat v1.1.0

Các thử nghiệm hiệu suất của chúng tôi cho thấy rằng khi gạch nối được bật, có tới 70% thời gian dành cho việc đo văn bản là trên gạch nối.

Dấu gạch nối chiếm đến 70% thời gian để đo văn bản

Do việc gạch nối thường không cần thiết cho tất cả các TextView trong một ứng dụng và vì ảnh hưởng đến hiệu suất, chúng tôi đã quyết định tắt gạch nối theo mặc định trong Android Q và AppCompat v1.1.0. Nếu bạn muốn sử dụng dấu nối, bạn cần bật thủ công trong ứng dụng của mình bằng cách đặt tần suất gạch nối thành bình thường. Bạn có thể thiết lập điều này theo nhiều cách:

  • Đặt thuộc tính TextAppearance trong styles.xml:
<style name="MyTextAppearance" parent="TextAppearance.AppCompat">
    <item name="android:hyphenationFrequency">normal</item>
</style>
  • Đặt một thuộc tính trong TextView:
<TextView android:hyphenationFrequency="normal" />
  • Đặt trực tiếp trong code:
textView.hyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NORMAL

Tìm hiểu thêm về gạch nối tại Android Dev Summit 2018.

Sử dụng multiple custom fonts trong cùng một TextView

Hãy cùng xem xét một nút mix giữa custom font (Lato trong ví dụ này) với một icon font:

Button với icon và Latin font

Button class chỉ chấp nhận một single instance của typeface được đặt trên text. Trước Q, bạn có thể tạo Typeface bằng một single font family. Android Q cho phép tạo một typeface từ multiple font families với API mới, Typeface.CustomFallbackBuilder, cho phép thêm tối đa 64 font families cho mỗi typeface.

Ví dụ implement icon font:

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

Khi tạo font family, cần chú ý rằng không đặt các fonts thuộc các families khác nhau trong cùng một font family object cũng như các fonts cùng kiểu vào cùng một font family. Ví dụ: đặt Lato, Kosugi và Material vào cùng một font family sẽ tạo ra một cấu hình không hợp lệ, cũng như đặt hai fonts đậm vào cùng một font family.

Để xác định font family chung (serif, sans-serif hoặc monospace) sẽ được sử dụng khi văn bản được hiển thị bằng fonts hệ thống, hãy sử dụng phương thức setSystemFallback() để đặt fonts dự phòng hệ thống:

Typeface.CustomFallbackBuilder(
    FontFamily.Builder(
       ...
    ).build()
).setSystemFallback("sans-serif")
.build()

Text styling API updates

Android Q mang đến một số cập nhật cho các API kiểu văn bản khác nhau:

Cải thiện hỗ trợ cho các phông chữ thay đổi

TextAppparent hiện hỗ trợ thuộc tính fontVariationSettings:

<style name="MyTextAppearance" parent="TextAppearance.AppCompat">
    <item name="android:fontVariationSettings">...</item>
</style>

Thuộc tính fontVariationSettings có thể được đặt trực tiếp trên TextView trong Android Q và trong AppCompatTextView:

<TextView
    ...
    app:fontVariationSettings="..."
/>

Cải thiện span APIs

TextAppparentSpan đã hỗ trợ typeface, shadow settings, fontFeatureSettingsfontVariationSettings.

LineBackgroundSpanLineHeightSpan hiện có các implement tiêu chuẩn: LineBackgroundSpan.StandardLineHeightSpan.Standard.

Access system fonts

Với hơn 100 ngôn ngữ được Android hỗ trợ và với các phông chữ khác nhau hỗ trợ các bộ ký tự khác nhau, việc biết phông chữ hệ thống nào có thể hiển thị một ký tự đã cho là không đáng kể. Các ứng dụng thực hiện kết xuất văn bản của riêng họ như trò chơi, trình xem tài liệu hoặc trình duyệt cần thông tin này. Trong Android Q, có thể truy xuất phông chữ hệ thống được hỗ trợ cho một chuỗi bằng API NDK của FontMatcher.

System fonts dùng để render text

Hãy xem xét các chuỗi tìm kiếm ở trên. API FontMatcher trả về cho chúng ta đối tượng phông chữ và độ dài. Một ví dụ code đơn giản hóa trông như thế này:

// 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("のな");

FontMatcher API không bao giờ trả về nullptr:

  • Nếu không có phông chữ nào hỗ trợ chuỗi đã cho, một phông chữ cho Tofu (󟿽), ký hiệu glyph bị thiếu sẽ được trả về.
  • Nếu không có kiểu chính xác nào được hỗ trợ, một phông chữ có kiểu gần nhất, giống nhất sẽ được trả về.

Nếu bạn muốn get tất cả các phông chữ hệ thống available, bạn có thể dùng API liệt kê phông chữ mới. Trong Java, bạn có thể sử dụng SystemFonts.getAvailableFonts hoặc trong NDK, bạn có thể sử dụng ASystemFontIterator. Kết quả liệt kê phông chữ chỉ được thay đổi bởi một bản cập nhật hệ thống, vì vậy bạn nên lưu trữ chúng.

Font updates

Font Myanmar mới

Android đã thêm một phông chữ Myanmar mới cho Android Q tương thích với Unicode và có khả năng hiển thị cả Unicode và Burmese không Unicode (thường được gọi là Zawgyi), ngay lập tức. Điều này có nghĩa là bắt đầu từ Android Q, Android giúp người dùng dễ dàng chuyển sang Unicode hơn: lần đầu tiên người dùng có thể sử dụng phông chữ Unicode để đọc văn bản Unicode và không Unicode. Android cũng đã bổ sung các yêu cầu mới cho CDD hệ sinh thái Android có yêu cầu mạnh mẽ hơn trong việc yêu cầu Unicode, bao gồm cả subtag "Qaag" mới mà các OEM nên sử dụng làm ngôn ngữ chỉ định Burmese. Tất cả những thay đổi này sẽ làm cho các nhà phát triển dễ dàng hơn trong thời gian dài, vì sự phân mảnh hệ sinh thái giảm làm cho việc phát triển dễ dàng hơn cho 50 triệu người dùng ở Myanmar.

Emoji mới

Emojis trên Android Q

Đây là những thay đổi đáng kể nhất về text trên Android Q. Cảm ơn các bạn đã đọc bài của mình 😄