PrecomputedText
显示文本可能很复杂,包含多种字体,行间距,字母间距,文本方向,换行符,连字符等功能。TextView必须做很多工作来测量和布置给定的文本:读取字体文件,查找字形,确定形状,测量边界框以及在内部字缓存中缓存单词。更重要的是,所有这些工作都发生在UI线程上,它可能会导致您的应用程序丢帧。
文本测量花费的时间占据文本设置的90%。为解决这一问题,在 Android P 中推出了一个新的 API: PrecomputedText。该 API 早先在 API 14中便可以通过 PrecomputedTextCompat 访问。
PrecomputedText 能够使 app 可以事先甚至在后台线程中执行文本布局最耗费时间的部分工作,以缓存布局结果,并返回宝贵的测量数据。然后 可以在 TextView 中设置 PrecomputedText.create(CharSequence, params) 的结果。这样,只有大约10%的工作留给 TextView 执行。
PrecomputedText.Params params = textView.getTextMetricsParams();
String text = PrecomputedText.create("Hello",params);
textview.setText(text);
注意: 将拒绝
PrecomputedText
从目标的不同参数创建的内容TextView
。请注意,NoCopySpan
附加到原始文本的任何内容都不会传递给PrecomputedText。
放大镜(Magnifier)
Android放大镜小工具。可以被附加到窗口的任何视图使用,放大镜小部件可以提供任何视图或曲面的放大版本,而不仅仅是文本。必须在最初创建此UI元素的线程上调用此方法。这通常是应用程序的主线程
放大镜有3种主要方法:显示,更新和消除。例如,您可以在为自定义视图实现onTouchEvent处理时调用这些方法。这将导致放大镜沿着屏幕跟随用户的手指。
//创建放大器
Magnifier magnifier = new Magnifier(View view)
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//显示放大器
magnifier.show(ev.getX(),ev.getY());
break;
case MotionEvent.ACTION_MOVE:
//显示放大器
magnifier.show(ev.getX(),ev.getY());
break;
case MotionEvent.ACTION_UP:
//取下放大器
magnifier.dismiss();
break;
}
return super.onTouchEvent(ev);
}
Smart Linkify
Android 9 增强了
TextClassifier
类,使用机器学习算法和模型来识别文本中的实体并建议采取相应的操作。这提高了所识别实体的可靠性。例如,如果Smart Linkify识别出电话号码,则API会建议诸如发送短信,拨打电话或添加联系人等操作。
注意:此接口中的方法都是是阻塞操作。应避免在UI线程中调用
新增属性(TextView)
- lineHeight:设置行与行之间的距离。代替lineSpacingExtra和lineSpacingMultiplier属性控制行之间的间距
- firstBaselineToTopHeight:设置TextView的上边界与TextView第一行的基线之间的距离。在代码中,此属性更新顶部填充。
- lastBaselineToBottomHeight:设置TextView的底部边界与TextView的最后一行的基线之间的距离。在代码中,此属性实际上更新了底部填充。
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Lorem ipsum dolor sit amet"
app:lineHeight="50sp"
app:firstBaselineToTopHeight="28sp"
app:lastBaselineToBottomHeight="20sp"/>
// Java代码实现
TextView.setLineHeight(@Px int)
TextView.setFirstBaselineToTopHeight(@Px int)
TextView.setLastBaselineToBottomHeight(@Px int)