Android 13 新的换行策略和针对日文的优化

简介: Android 13 新的换行策略和针对日文的优化

前言

Android 13 向 TextView 控件引入了新的换行策略,同时针对日文提供了换行优化。系统将依据开发者指定的换行策略、日文短语换行策略进行文本换行。这将促使文本内容不再杂乱无章、更加具有层次、便于阅读。


下面我们从 API、实战、适配办法等多个角度来快速学习一下这个新特性。

换行策略 lineBreakStyle

Indicates the line break strategies can be used when calculating the text wrapping.

1672189656496.png事实上来自于 CSS 的 line-break 属性,主要是针对 CJK 语言,也就是中日韩 3 种语言提供的换行规则。


Android 提供的属性和 CSS 的略有差异,但 loose、normal 和 strict 这三个属性进行了保留,后面将通过 DEMO 进行属性表现上的差异说明。

短语换行策略 lineBreakWordStyle

Specify the phrase-based line break can be used when calculating the text wrapping.

Constant Value Description
none 0 No line break word style specific.
phrase 1 Specify the phrase based breaking.

默认不生效,设置为 phrase 则生效。

动态设置

除了上述属性以外,TextView 理所应当地提供了 setLineBreakConfig() 来动态更新换行策略。

public void setLineBreakConfig (LineBreakConfig lineBreakConfig)
Parameters
lineBreakConfig LineBreakConfig: the line break config for text wrapping. This value cannot be null.

LineBreakConfig

Android 13 新引入的承载换行策略的配置类,提供了上述属性相对应的常量以及返回策略所必要的 get 方法。

1672189691810.png

public int getLineBreakWordStyle ()
public int getLineBreakStyle ()

实战

我们在中文和日语两种语言环境下提供一些测试文本,探究在不同换行策略下文本的实际表现。

换行策略的效果

换行策略的表现跟 CJK 语言里一些特定符号有关系,普通的文本表现上区别不是很明显。所以我们预设特别的一段文本在不同的显示宽度下的表现,来简要展现下不同规则下的差异。

  • 测试文本:【这里有个弯弯符号〜加“引号”然后最后有个问号?后面是普普通通一句话。】
class MainActivity : AppCompatActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        LineBreakConfig().run {
            lineBreakStyle = LINE_BREAK_STYLE_NONE
            lineBreakWordStyle = LINE_BREAK_WORD_STYLE_NONE
            breakTestTextViewCSS.lineBreakConfig = this
            breakTestTextViewCSS_2.lineBreakConfig = this
        }
    }
    fun onButtonClick(view: View) {
        when (view.id) {
            R.id.break_btn -> breakTestTextViewCSS.lineBreakConfig.apply {
                lineBreakStyle =
                    when (breakTestTextViewCSS.lineBreakConfig.lineBreakStyle) {
                        LINE_BREAK_STYLE_NONE -> LINE_BREAK_STYLE_LOOSE
                        LINE_BREAK_STYLE_LOOSE -> LINE_BREAK_STYLE_NORMAL
                        LINE_BREAK_STYLE_NORMAL -> LINE_BREAK_STYLE_STRICT
                        LINE_BREAK_STYLE_STRICT -> LINE_BREAK_STYLE_NONE
                        else -> LINE_BREAK_STYLE_NONE
                    }
                breakTestTextViewCSS.lineBreakConfig = this
                breakTestTextViewCSS_2.lineBreakConfig = this
            }
        }
    }
}

1672189750160.png

1672189764127.png

可以看到


none 和 strict 策略下,符号〜的前方必须有文字,不能单独作为行首,而 loose 和 normal 策略则无此限制

另外按照 css 的说明,只有在 strict 策略下,符号〜才允许作为行尾进行换行。但在 Android 13 上的测试发现,无论哪种策略都允许符号〜作为行尾换行,可能跟宽度配置有些关系

loose 策略下,符号? 允许在行首单独出现,而其他模式不允许,前面必须要有其他文字才可换行

其他更详细的换行差异可以参考 w3c 的 css 换行说明,并进行实际的尝试。

短语换行策略效果

短语换行策略指的是日文情况下句尾遇到短语、助词如何换行,是固定换行还是短语整体另起一行。


测试文本:【常に最新、最高のモバイル。Androidを開発した同じチームから。】

起初觉得只要展示的是日文都会应用该策略,便没有注意 App 当前语言是中文,以外发现画面中的日文文本没有按照预期进行换行。

class MainActivity : AppCompatActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        LineBreakConfig().run {
            lineBreakStyle = LINE_BREAK_STYLE_NONE
            lineBreakWordStyle = LINE_BREAK_WORD_STYLE_NONE
            breakTestTextView.lineBreakConfig = this
        }
    }
    fun onButtonClick(view: View) {
        when (view.id) {
            R.id.phrase_break_btn -> breakTestTextView.lineBreakConfig.apply {
                lineBreakWordStyle =
                    if (breakTestTextView.lineBreakConfig.lineBreakWordStyle == LINE_BREAK_WORD_STYLE_PHRASE)
                        LINE_BREAK_WORD_STYLE_NONE
                    else LINE_BREAK_WORD_STYLE_PHRASE
                breakTestTextView.lineBreakConfig = this
            }
        }
    }
}

2Zmh5D.gif

需要当前语言是日语

当 App 语言切换为日语场景后,短语换行策略才会生效。

2Zmh5D.gif

后来想想也是合理的,非日语的场景下用户能读懂日语的概率很低,在意换行的可能性更加小。系统没有必要耗费精力去判断文字是否是日文和进行换行。

而当 App 语言是日语的话,用户极高概率能读懂并且在乎短语换行的合理和连贯性,所以只在日语情况下生效则显得非常合理。

性能测试

可能有开发者会担心开启了短语换行是否造成性能的负担。通过覆写 TextView 并在 onMeasure() 里加入耗时统计,测定了展示 10000 个杂乱的日文文本下,短语换行策略开启与否的时间表现。

  • 设备版本是:Pixel 4 XL 13 Beta 1

1672189831456.png

可以看到即便是长度达到 10000 的超长文本,开启了短语换行策略的性能表现依旧没有什么明显劣化。在实际开发当中,显示长度达到 10000 的 TextView 文本的情况实属罕见。


我们可以断定短语换行策略对于文本显示的性能影响可以忽略不计。


另外,需要说明的是 TargetSDKVersion 不用升级到 33,所有的换行特性均可生效。

原理

目前只公开了 preview-1 的代码,搜索了一下没有发现 LineBreakConfig 相关的实现,后续等 Beta 版代码公开之后再作研究。


https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android-t-preview-1/

适配

  1. 思考下 App 是否需要开启新的换行策略
  2. 如果 App 支持日语的话,建议开启短语换行策略,优化日文的阅读体验
  3. 确定开启上述新策略的话,需要注意如下两点影响:
  • 画面布局是否发生错乱、切掉
  • 与已有的日文手动换行 \n 是否会发生冲突

总结

本新特性非常简单直白,我们可以使用换行策略去指定和 css 一致的换行规则,也可以针对日语指定换行友好的短语策略。


和 View 的一般用法无差,均有属性配置和动态更新两种方案。


另外,留意如下几点:


该新特性不要求升级 TargetSDKVersion

指定换行策略的话需要留意布局是否发生错乱、切掉的问题

指定短语换行策略的话需要检查是否会和已有的手动换行发生冲突

当前语言是日语环境下,短语换行策略才可以生效

短语换行策略对于性能的影响可以忽略不计

参考资料

https://developer.android.google.cn/reference/android/widget/TextView

https://developer.android.google.cn/reference/android/graphics/text/LineBreakConfig

https://www.w3.org/TR/css-text-3/#line-break-property

https://www.zhangxinxu.com/wordpress/2021/02/css-line-break/


相关文章
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
806 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
497 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
安全 数据安全/隐私保护 Android开发
探索Android与iOS的隐私保护策略
在数字时代,智能手机已成为我们生活中不可或缺的一部分,而随之而来的则是对个人隐私和数据安全的日益关注。本文将深入探讨Android与iOS两大操作系统在隐私保护方面的策略和实践,分析它们如何应对日益严峻的隐私挑战,以及用户应如何保护自己的数据安全。通过对比分析,我们将揭示两大系统在隐私保护方面的优势和不足,为用户提供有价值的见解和建议。
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
3661 77
|
11月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
425 1
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
420 3
|
前端开发 Android开发 开发者
探索Android与iOS的跨平台开发策略
在当今多元化的移动设备市场中,开发者面临着为不同操作系统设计应用的挑战。本文深入探讨了Android和iOS两大主流平台的跨平台开发策略。我们将分析使用Flutter、React Native等框架进行跨平台开发的优劣,并讨论如何克服各平台间的差异性,以实现高效、一致的用户体验。此外,文章还将提供一些实用的技巧和最佳实践,帮助开发者优化跨平台应用的性能和兼容性。
331 4
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
284 4

热门文章

最新文章