Android P 中的新文本特性

4,027 阅读5分钟

由开发推广专员 Florina Muntenescu 和 Android 文本技术主管 Siyamed Sinir 发布

在 “What’s new in Android P Beta” 中我们已经谈到 Android 的两个新文本特性。现在既然 Android P Beta 3最终 API均已推出 ,我们也该深入地探究它究竟有哪些新文本特性。众所周知, TextView 是 Android 视图系统中最关键的组件之一。这也是我们一直在面向开发者及用户的特性及 API 改进方面投资的原因。

PrecomputedText

文本展示非常复杂,其涵盖的特性有:多种字体、行间距、字间距、文本方向、断行、字符连接等。为了测量及布局给定文本,TextView 必须做很多工作,例如读取字体文件、查找字形、决定形状、测量边界框以及将文本缓存在内部文本缓存中。更重要的是,所有这些工作都在 UI 线程中进行,这就有可能导致 app 帧数下降。

我们发现文本测量花费的时间占据文本设置的90%。为解决这一问题,在 Android P 中,以及作为 Jetpack 的一部分,我们推出了一个新的 API: PrecomputedText。该 API 早先在 API 14中便可以通过 PrecomputedTextCompat 访问。

PrecomputedText 能够使 app 可以事先甚至在后台线程中执行文本布局最耗费时间的部分工作,以缓存布局结果,并返回宝贵的测量数据。然后 可以在 TextView 中设置 PrecomputedText.create(CharSequence, params) 的结果。这样,只有大约10%的工作留给 TextView 执行。

△ 测量及布局文本花费的时间比例

放大器(Magnifier)

即使有像智能文本选择这样的特性,精准的文本选择还是有些困难。Android P 推出了文本放大器,以提升文本选择方面的用户体验。由于该放大器提供了可以在文本上方拖拽的文本放大面板,所以有助于用户精准地定位光标或文本选择手柄。

△ 在 Android P 中放大文本
我们想让用户在所有 app 中都拥有相同的体验,无论是在定制窗口小部件中还是在定制文本呈现时,我们设置了一个放大器窗口小部件,因此附加在窗口上的任何视图可以利用该部件。该放大器窗口小部件可以提供任何视图或界面的放大版本,不仅仅是文本。

放大器有3种主要方法:show、update 及 dismiss。例如,您可以在实现定制视图onTouchEvent 处理时调用这些方法。这样放大器就可以跟随用户在屏幕上的手指移动。

Smart Linkify

Linkify 类自 API 1以来一直存在,它允许运用正则表达式为文本添加链接。除此之外,它会调用 WebView 的实例来查找物理地址,这样可能会降低请求链接的 app 的性能。为了能提供更准确的链接,尤其对于国际化文本,以及消除 WebView 造成的性能降低,我们创建了 Smart Linkify。它可以通过 TextClassifier API 进行访问。

Smart Linkify 使用机器学习算法及模型识别文本中的实体。这种方式提高了实体识别的可靠性。Smart Linkify 可以根据实体类别来对用户可采取的操作提出建议。比如,如果Smart Linkify 识别到电话号码,便会给出建议,比如发送文本短信、打电话或添加到通讯录。

△ Android P 中的 Smart Linkify
为提高 app 的性能,可以将链接的生成及应用工作放到后台线程中。

行高及基线文本对齐

有时设计者提供给开发者的布局参数与现有的 TextView 属性不完全匹配。在 Android P 及 Jetpack 中,我们增加了三个属性及其相应方法,以弥合由设计者与开发者工作方式的不同带来的分歧。

设置行高

在 Android P 之前,行间距可以由 lineSpacingExtra 及 lineSpacingMultiplier 属性控制。然而,设计者通常会使用一个简单的行高来设置这些值。为此,在 Android P 上,我们增加了 lineHeight 属性以设置文本行高,即行顶部与底部之间的间距(或两个连续的基线之间的间距)。实际上,该属性利用及更改了现有的 lineSpacingExtra 及 lineSpacingMultiplier 属性。

△ 行高及字体大小

设置基线文本对齐

为控制首行及末行基线与视图边界之间的间距,我们增加了两个新属性: firstBaselineToTopHeight 与 lastBaselineToBottomHeight。

firstBaselineToTopHeight: 设置 TextView 的上边界及 TextView 的首行基线之间的间距。该属性实际上更改的是顶部边距。

lastBaselineToBottomHeight: 设置 TextView 的下边界及 TextView 的末行基线之间的间距。该属性实际上更改的是底部边距。

△ 首行基线到顶部及末行基线到底部的距离

文本在大部分 app 中都扮演着重要角色,它是 app 设计语言的关键组成部分。文本由用户使用,甚至用于呈现表情符号。我们将持续在文本上投资,以提升 app 用户及开发者的体验。

如果想了解更多文本 API 的使用及 Android P 的新文本特性,请查看 Google I/O 2018 关于 “Best practices with text” 的讨论视频

点击这里前往 “Android Developers 官方文档” 查看更多信息