Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

+AndroidDevelopers ANDROID TEXTUAL LAYOUT Raph Levien +RaphLevien @raphlinus Android UI Toolkit @AndroidDev

Slide 3

Slide 3 text

SECTION TITLE OUTLINE

Slide 4

Slide 4 text

OUTLINE +AndroidDevelopers @AndroidDev Challenges and Opportunities Material Design Roboto 2 Noto fonts OpenType typography features High quality paragraph layout

Slide 5

Slide 5 text

SECTION TITLE CHALLENGES AND OPPORTUNITIES

Slide 6

Slide 6 text

CHALLENGES AND OPPORTUNITIES +AndroidDevelopers @AndroidDev Challenge Opportunity Battery and RAM constraints 60 fps Small screen Support ~all the scripts of the world Small text regions Powerful compute resources Animations and transitions Very high resolution (500+ dpi) Roboto and Noto fonts Line breaking improvements

Slide 7

Slide 7 text

SECTION TITLE DISPLAY TECHNOLOGY

Slide 8

Slide 8 text

DISPLAY TECHNOLOGY +AndroidDevelopers @AndroidDev Photo credit: Peter Dassow Sharp PC-1211 pocket computer, ca 1980

Slide 9

Slide 9 text

DISPLAY TECHNOLOGY +AndroidDevelopers @AndroidDev Laptop ~100ppi HTC One m7 468ppi 4k monitor 200ppi inkjet printer 360ppi

Slide 10

Slide 10 text

DISPLAY TECHNOLOGY +AndroidDevelopers @AndroidDev Nexus 6P 1440 x 2560 pixels 515 ppi

Slide 11

Slide 11 text

SECTION TITLE MATERIAL DESIGN

Slide 12

Slide 12 text

MATERIAL DESIGN (L+) +AndroidDevelopers @AndroidDev ● An entire design language ● Widely adopted ○ Web and Android apps ● Typography is integral ○ Multiple weights and sizes ○ Layout, alignment, space https://www.google. com/design/spec/style/typograph y.html

Slide 13

Slide 13 text

ROBOTO 2 (L+) +AndroidDevelopers @AndroidDev ● Updated design ● Expanded Unicode coverage ○ 1051 → 3296 glyphs ○ Unicode 8 for Latin, Greek Cyrillic ● 18 weights/styles shipping on device ○ Thin, Light, Regular, Medium, Bold, Black ○ True italics ○ Condensed ● Fully open source (including build chain) ○ https://github.com/google/roboto

Slide 14

Slide 14 text

ROBOTO 2: DESIGN UPDATE +AndroidDevelopers @AndroidDev

Slide 15

Slide 15 text

ANDROID’S GLOBAL REACH

Slide 16

Slide 16 text

THE NEXT BILLION USERS

Slide 17

Slide 17 text

ROBOTO 2: UNICODE COVERAGE

Slide 18

Slide 18 text

SECTION TITLE NOTO FONTS

Slide 19

Slide 19 text

NOTO SCRIPT SUPPORT IN MARSHMALLOW Arabic, Armenian, Balinese, Bamum, Batak, Bengali, Buginese, Buhid, Canadian Aboriginal, Cham, Cherokee, Coptic, Devanagari, Ethiopic, Georgian, Glagolitic, Gujarati, Gurmukhi, Hanunoo, Hebrew, Javanese, Kannada, Kayah Li, Khmer, Lao, Lepcha, Limbu, Lisu, Malayalam, Mandaic, Meetei Mayek, Mongolian, Myanmar, N'Ko, New Tai Lue, Ol Chiki, Oriya, Rejang, Saurashtra, Sinhala, Sundanese, Syloti Nagri, Syriac Estrangela, Tagbanwa, Tai Le, Tai Tham, Tai Viet, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Vai, Yi +AndroidDevelopers @AndroidDev

Slide 20

Slide 20 text

NOTO SCRIPT SUPPORT IN MARSHMALLOW +AndroidDevelopers @AndroidDev Tibetan Vai Mongolian

Slide 21

Slide 21 text

NOTO CJK (L+) +AndroidDevelopers @AndroidDev ● Joint project with Adobe ○ Also released as Source Han Sans ○ https://github.com/adobe-fonts/source-han-sans ● Rendered on Android with high-quality (Adobe) CFF renderer ○ http://www.freetype.org/ ● Support for Simplified and Traditional Chinese, Japanese, Korean ○ Comprehensive coverage ● Unified design but correct handling of variants

Slide 22

Slide 22 text

NOTO COLOR EMOJI +AndroidDevelopers @AndroidDev ● Bitmap color font technology ○ Standardized in OpenType 1.7 ● No special app support needed, it’s “just text” ● Flags and keycaps ○ Implemented with GSUB ligatures ● Use Paint.hasGlyph() to detect whether emoji exists

Slide 23

Slide 23 text

SECTION TITLE TYPOGRAPHY FEATURES

Slide 24

Slide 24 text

OPENTYPE SUPPORT (L+) +AndroidDevelopers @AndroidDev ● Kerning and ligatures ○ on by default, but can disable ● font-feature-settings ○ CSS-compatible syntax ○ old-style, tabular, lining figures ○ fraction forms ○ discretionary ligatures ● ‘locl’ feature: localized forms ○ automatically selected based on locale

Slide 25

Slide 25 text

KERNING AND LIGATURES +AndroidDevelopers @AndroidDev default android:fontFeatureSettings="'kern' off, 'liga' off"

Slide 26

Slide 26 text

OPENTYPE FEATURE: NUMBER FORMS (L+) +AndroidDevelopers @AndroidDev default android:fontFeatureSettings="'pnum'" android:fontFeatureSettings="'onum'"

Slide 27

Slide 27 text

LETTERSPACING (L+) +AndroidDevelopers @AndroidDev android:letterSpacing="-0.08" android:letterSpacing="-0.04" android:letterSpacing="0" android:letterSpacing="0.04" android:letterSpacing="0.08"

Slide 28

Slide 28 text

HIGH QUALITY PARAGRAPH LAYOUT (M+) +AndroidDevelopers @AndroidDev ● Shipping in Marshmallow ● Automatic hyphenation ○ Algorithms and patterns based on TeX ● Whole-paragraph optimization ○ Also based on TeX ○ Parameters tuned: ■ Don’t hyphenate next-to-last line ■ Do hyphenate to prevent one word on last line ● High quality mode on by default ○ But can disable under program control (breakStrategy="normal") ○ Performance comparable to Lollipop

Slide 29

Slide 29 text

HIGH QUALITY PARAGRAPH LAYOUT (M+) android:breakStrategy="simple" android:breakStrategy="high_quality" android:hyphenationFrequency="full"

Slide 30

Slide 30 text

BREAKSTRATEGY: BALANCED (M+) +AndroidDevelopers @AndroidDev normal balanced It’s not great when a word is by itself on the last line. It’s not great when a word is by itself on the last line. Based on Adobe’s text-wrap: balanced proposal android:breakStrategy="balanced"

Slide 31

Slide 31 text

THE IMPORTANCE OF LOCALE +AndroidDevelopers @AndroidDev Font selection (especially 簡化字 / 正體字) locl OpenType feature lookup ICU line breaking (dictionary-based) Automatic hyphenation (rule-based and exception dict) App TextView Settings (system-wide) setTextLocale() TextView with styled spans LocaleSpan Tip: use Compact Language Detector 2 library

Slide 32

Slide 32 text

THANK YOU Questions? +AndroidDevelopers @AndroidDev