昨天晚上点明安卓完成暑期版重磅升级,新增了超级浏览与焦点智能排列功能,本次重点调整了滑动浏览模式下屏幕阅读器的焦点遍历顺序。不少圈友更新后疑惑:为什么日常滑动浏览微信等页面时,焦点顺序和以前不一样了?其实这并非软件故障,而是新版本把焦点遍历规则从旧版的空间顺序,调整为可自主切换的逻辑顺序,下面我就来详细科普一下。
可能很多伙伴不太理解,屏幕阅读器的焦点顺序到底有什么区别?其实主要分为两种,一种是逻辑顺序,另一种是空间顺序。我用一个生活化的场景给大家通俗解释一下。
敬酒先敬谁:逻辑顺序看的是辈分,不是座位
我们就以一家四口吃饭来举例,分别是爷爷、父亲、母亲和自己。
先说逻辑顺序,就好比家族里的长幼尊卑规矩。按照传统礼数敬酒,不管座位怎么排布,都要先敬长辈,再按辈分依次来。先给爷爷敬酒,再到父亲,接着是母亲,最后才轮到自己。
放到手机页面上也是一个道理:逻辑顺序是按照软件开发人员写代码的先后顺序、功能层级逻辑来排序的。用技术术语讲,页面上的所有控件本质上构成了一棵“视图树(View Hierarchy)”,开发者写界面布局时,控件在XML代码里的嵌套顺序就是这棵树的节点层级。系统底层通过AccessibilityNodeInfo把这些控件的无障碍信息组织起来,读屏在遍历时,默认沿着这棵视图树做深度优先遍历(Depth-First Search,简称 DFS),从上往下、从父节点到子节点逐个访问。开发者先写哪个控件、后写哪个模块,读屏就按这个固定顺序挨个遍历,不受屏幕上按钮实际摆放位置影响,只遵循代码本身的编写逻辑。
换一种敬法:空间顺序只认坐哪儿,不认辈分
再来说空间顺序,这个就完全看实际摆放位置了。同样是一家人吃饭,不看辈分规矩,只按坐的远近、位置先后依次敬酒。离自己最近的先倒酒,比如先敬母亲,再到爷爷,接着是父亲,最后轮到自己。
对应到手机页面,空间顺序就是遵循我们正常的视觉阅读习惯,按照屏幕从上到下、从左到右的Z字形布局来遍历焦点。不管代码编写的先后,只看控件在屏幕上实际处在哪个位置,按视觉排布依次朗读。它的底层原理是:每个控件在屏幕上都有一个几何坐标边界,由X轴、Y轴坐标以及宽高决定控件在屏幕上的物理区域。读屏在切换为空间顺序后,会读取这些坐标数据,按照从上到下、从左到右的规则对焦点进行几何排序和焦点重排(Focus Reordering),根据控件实际出现在屏幕上的视觉位置重新组织遍历队列,而不是按代码里的节点嵌套顺序来走。
再拿微信首页举个大家都熟悉的例子,方便大家更好理解。
按照旧版逻辑顺序遍历的时候:读屏会先读到页面顶部的微信标题,继续滑动浏览会话列表,接着读到底部微信、通讯录、发现、我这一栏导航,最后才能遍历到右上角的搜索和更多功能按钮。之所以会这样,是因为开发者写代码时,先做了顶部标题,再实现消息会话列表,然后编写底部导航栏,最后才写右上角的搜索和快捷入口——XML里就是这个嵌套顺序,读屏沿视图树做深度优先遍历,自然就是这个结果。所以右上角明明在页面最上方,却反倒最后才被读到。
如果切换成空间顺序,就完全不一样了:会贴合我们肉眼看屏幕的习惯,先读顶部微信标题,紧接着就读到右上角搜索、更多按钮,再往下浏览消息会话列表,最后才读取底部的导航栏目。因为右上角按钮的Y坐标靠上、X坐标靠右,在几何排序规则下优先级排在消息列表前面。完全按照页面视觉布局、从上到下、从左到右的自然顺序走,更符合普通人浏览页面的感知习惯。
别急着站队:TalkBack 其实是“混合双打”
聊到这里,可能已经有伙伴在心里默默站队了:空间顺序听起来这么符合直觉,逻辑顺序又古老又死板,那以后读屏都改成纯空间遍历不就行了?
事情没有这么简单。咱们来看看 Android 原生的 TalkBack 在底层到底是怎么做的。
你以为 TalkBack 是纯逻辑顺序?或者以为它是纯空间顺序?其实都不是。现在的 TalkBack,玩的是一套混排算法(Hybrid Sorting Algorithm)。简单说,就是逻辑和空间这俩兄弟谁也别想单飞,得搭伙干活。
用逛商场的场景来类比,大家一听就懂。你走进一座大商场,最先冒出来的概念不是具体某件商品摆在哪个货架上,而是“这一层有哪些店”——这是化妆品区,那是运动品牌区,拐角还有个咖啡店。这种“先找店”的思维,在代码底层就对应着视图树里的容器节点(ViewGroup)。系统先在宏观层面做“逻辑画圈”:哪些控件属于同一个功能区块、同一个容器,先把这个边界框定出来。进了某家店之后,你不会再按什么品牌注册时间先后去找东西,而是直接看店里的实际陈列:门口摆的是新品,往里走是折扣区,收银台在最里面。这时候,你遵循的就是空间几何坐标排布,从近到远、从左到右依次看过去。
TalkBack 的混排机制,大体就是这个意思:先在逻辑层面把属于同一个 ViewGroup 的控件归拢到一起,保证“一家人”不被打散;进入这个 ViewGroup 内部之后,再按空间坐标做几何排序,模拟视觉上的自然浏览路径。系统既没有完全抛弃代码逻辑,也没有像扫描仪一样死板地逐行扫射,而是在两者之间找平衡——逻辑定大局,空间走细节。
纯空间走到底,可能会把一张卡片拆成碎片
那么问题来了:如果完全抛弃逻辑顺序,搞“一刀切”的纯空间遍历,会发生什么?
在国内这些复杂得像迷宫一样的 App 里,可能会引发一场灾难性的“语义割裂(Semantic Fragmentation)”。拿电商 App 的商品列表举个例子,大家一听就明白。一个商品卡片,左边是商品图,右边是标题,标题下面是价格。这几个控件在代码里属于同一个 ViewGroup,在语义上是一个整体,共同描述同一件商品。如果用纯空间顺序,像扫描仪一样从上到下、从左到右逐行扫过去,读屏可能会先读到第一张卡片的图片,然后读到标题,紧接着因为坐标横向推进的关系,还没等读到价格,焦点就跳到了第二张卡片的图片上。结果用户听到的就是:图片、标题、图片、标题、价格、图片、标题、价格。原本属于同一张卡片的控件联系被坐标排序硬生生切断了,信息碎了一地,完全没办法拼凑出一个完整的商品信息。
这就是为什么逻辑顺序虽然古老,但在保证语义完整这件事上有它不可替代的价值。反过来看,空间顺序虽然更符合视觉直觉,但它需要逻辑顺序在背后先把这些语义单元圈好,否则就会好心办坏事。真正成熟的方案,是在两者之间找到一个平衡点。
这一次升级的调整不是终点,统一规则这件事值得想得更远
说回这次升级的调整。坦率讲,目前的方案也不是完全意义上的纯空间顺序,这一点大家在使用中应该也能感受到。更新之后,不少伙伴在抖音这类布局比较随意的页面上,反而觉得有点不太适应了,页面浏览的习惯一下子被打乱,感觉焦点轨迹跟脑海中的预期对不上了,这也是完全正常的。
关于这个情况,我已经把一些核心的体验和诉求集中反馈给了官方。大家在使用的过程中如果也碰到了某些页面上浏览顺序不合理、感知突兀的情况,也可以梳理一下具体页面和场景,把线索汇总过来,我能帮到的一定会继续提交过去,也可以通过点明设置、联系我们,联系点明客服,以及加入点明软件官方QQ群:198248434进行反馈,或关注“点明科技”微信公众号,获取更多帮助信息。开发者现在还在可能根据反馈逐步打磨策略,这些真实的声音对他们来说是很关键的参考。
最后想多说一句。我认为这次对于焦点遍历规则的调整,某种意义上算是做了一个新的尝试和引领。让三方屏幕阅读器的焦点规则逐步向 TalkBack 靠拢,朝着统一的维度去对齐,其实是一个非常有价值的方向。试想一下,如果各家读屏的焦点遍历规则能够相对统一,那后续大家在反馈 App 无障碍问题时,就会有更一致的标准和参照,不再出现同一个页面在不同读屏上呈现效果各说各话的局面,这对于整个生态的规范化是有切实帮助的。希望后续其他的三方屏幕阅读器,也能够陆续在这个方向上跟进和探索。
从深层来看,这种从“逻辑顺序”向“空间顺序”的倾斜,其实是无障碍体验优化的一个主流趋势——系统在底层充当了翻译官,把原本面向开发者的代码逻辑顺序,转化为更贴合用户直觉感知的视觉空间顺序,让读屏的浏览体验跟眼睛看到的东西真正对应起来。大家升级之后,可以亲自滑动体验,感受下新旧版本浏览顺序的差别,在日常使用中如果发现适配问题,也可以把具体页面和场景梳理出来,这些真实的声音对开发者逐步打磨策略是很关键的参考。
想体验这次升级新变化的伙伴可以在点明市场升级点明安卓,然后到点明设置、读屏设置、更多设置,开启超级浏览和焦点智能排列进行体验。
目录
昨天晚上点明安卓完成暑期版重磅升级,新增了超级浏览与焦点智能排列功能,本次重点调整了滑动浏览模式下屏幕阅读器的焦点遍历顺序。不少圈友更新后疑惑:为什么日常滑动浏览微信等页面时,焦点顺序和以前不一样了?其实这并非软件故障,而是新版本把焦点遍历规则从旧版的空间顺序,调整为可自主切换的逻辑顺序,下面我就来详细科普一下。
可能很多伙伴不太理解,屏幕阅读器的焦点顺序到底有什么区别?其实主要分为两种,一种是逻辑顺序,另一种是空间顺序。我用一个生活化的场景给大家通俗解释一下。
敬酒先敬谁:逻辑顺序看的是辈分,不是座位
我们就以一家四口吃饭来举例,分别是爷爷、父亲、母亲和自己。
先说逻辑顺序,就好比家族里的长幼尊卑规矩。按照传统礼数敬酒,不管座位怎么排布,都要先敬长辈,再按辈分依次来。先给爷爷敬酒,再到父亲,接着是母亲,最后才轮到自己。
放到手机页面上也是一个道理:逻辑顺序是按照软件开发人员写代码的先后顺序、功能层级逻辑来排序的。用技术术语讲,页面上的所有控件本质上构成了一棵“视图树(View Hierarchy)”,开发者写界面布局时,控件在XML代码里的嵌套顺序就是这棵树的节点层级。系统底层通过AccessibilityNodeInfo把这些控件的无障碍信息组织起来,读屏在遍历时,默认沿着这棵视图树做深度优先遍历(Depth-First Search,简称 DFS),从上往下、从父节点到子节点逐个访问。开发者先写哪个控件、后写哪个模块,读屏就按这个固定顺序挨个遍历,不受屏幕上按钮实际摆放位置影响,只遵循代码本身的编写逻辑。
换一种敬法:空间顺序只认坐哪儿,不认辈分
再来说空间顺序,这个就完全看实际摆放位置了。同样是一家人吃饭,不看辈分规矩,只按坐的远近、位置先后依次敬酒。离自己最近的先倒酒,比如先敬母亲,再到爷爷,接着是父亲,最后轮到自己。
对应到手机页面,空间顺序就是遵循我们正常的视觉阅读习惯,按照屏幕从上到下、从左到右的Z字形布局来遍历焦点。不管代码编写的先后,只看控件在屏幕上实际处在哪个位置,按视觉排布依次朗读。它的底层原理是:每个控件在屏幕上都有一个几何坐标边界,由X轴、Y轴坐标以及宽高决定控件在屏幕上的物理区域。读屏在切换为空间顺序后,会读取这些坐标数据,按照从上到下、从左到右的规则对焦点进行几何排序和焦点重排(Focus Reordering),根据控件实际出现在屏幕上的视觉位置重新组织遍历队列,而不是按代码里的节点嵌套顺序来走。
再拿微信首页举个大家都熟悉的例子,方便大家更好理解。
按照旧版逻辑顺序遍历的时候:读屏会先读到页面顶部的微信标题,继续滑动浏览会话列表,接着读到底部微信、通讯录、发现、我这一栏导航,最后才能遍历到右上角的搜索和更多功能按钮。之所以会这样,是因为开发者写代码时,先做了顶部标题,再实现消息会话列表,然后编写底部导航栏,最后才写右上角的搜索和快捷入口——XML里就是这个嵌套顺序,读屏沿视图树做深度优先遍历,自然就是这个结果。所以右上角明明在页面最上方,却反倒最后才被读到。
如果切换成空间顺序,就完全不一样了:会贴合我们肉眼看屏幕的习惯,先读顶部微信标题,紧接着就读到右上角搜索、更多按钮,再往下浏览消息会话列表,最后才读取底部的导航栏目。因为右上角按钮的Y坐标靠上、X坐标靠右,在几何排序规则下优先级排在消息列表前面。完全按照页面视觉布局、从上到下、从左到右的自然顺序走,更符合普通人浏览页面的感知习惯。
别急着站队:TalkBack 其实是“混合双打”
聊到这里,可能已经有伙伴在心里默默站队了:空间顺序听起来这么符合直觉,逻辑顺序又古老又死板,那以后读屏都改成纯空间遍历不就行了?
事情没有这么简单。咱们来看看 Android 原生的 TalkBack 在底层到底是怎么做的。
你以为 TalkBack 是纯逻辑顺序?或者以为它是纯空间顺序?其实都不是。现在的 TalkBack,玩的是一套混排算法(Hybrid Sorting Algorithm)。简单说,就是逻辑和空间这俩兄弟谁也别想单飞,得搭伙干活。
用逛商场的场景来类比,大家一听就懂。你走进一座大商场,最先冒出来的概念不是具体某件商品摆在哪个货架上,而是“这一层有哪些店”——这是化妆品区,那是运动品牌区,拐角还有个咖啡店。这种“先找店”的思维,在代码底层就对应着视图树里的容器节点(ViewGroup)。系统先在宏观层面做“逻辑画圈”:哪些控件属于同一个功能区块、同一个容器,先把这个边界框定出来。进了某家店之后,你不会再按什么品牌注册时间先后去找东西,而是直接看店里的实际陈列:门口摆的是新品,往里走是折扣区,收银台在最里面。这时候,你遵循的就是空间几何坐标排布,从近到远、从左到右依次看过去。
TalkBack 的混排机制,大体就是这个意思:先在逻辑层面把属于同一个 ViewGroup 的控件归拢到一起,保证“一家人”不被打散;进入这个 ViewGroup 内部之后,再按空间坐标做几何排序,模拟视觉上的自然浏览路径。系统既没有完全抛弃代码逻辑,也没有像扫描仪一样死板地逐行扫射,而是在两者之间找平衡——逻辑定大局,空间走细节。
纯空间走到底,可能会把一张卡片拆成碎片
那么问题来了:如果完全抛弃逻辑顺序,搞“一刀切”的纯空间遍历,会发生什么?
在国内这些复杂得像迷宫一样的 App 里,可能会引发一场灾难性的“语义割裂(Semantic Fragmentation)”。拿电商 App 的商品列表举个例子,大家一听就明白。一个商品卡片,左边是商品图,右边是标题,标题下面是价格。这几个控件在代码里属于同一个 ViewGroup,在语义上是一个整体,共同描述同一件商品。如果用纯空间顺序,像扫描仪一样从上到下、从左到右逐行扫过去,读屏可能会先读到第一张卡片的图片,然后读到标题,紧接着因为坐标横向推进的关系,还没等读到价格,焦点就跳到了第二张卡片的图片上。结果用户听到的就是:图片、标题、图片、标题、价格、图片、标题、价格。原本属于同一张卡片的控件联系被坐标排序硬生生切断了,信息碎了一地,完全没办法拼凑出一个完整的商品信息。
这就是为什么逻辑顺序虽然古老,但在保证语义完整这件事上有它不可替代的价值。反过来看,空间顺序虽然更符合视觉直觉,但它需要逻辑顺序在背后先把这些语义单元圈好,否则就会好心办坏事。真正成熟的方案,是在两者之间找到一个平衡点。
这一次升级的调整不是终点,统一规则这件事值得想得更远
说回这次升级的调整。坦率讲,目前的方案也不是完全意义上的纯空间顺序,这一点大家在使用中应该也能感受到。更新之后,不少伙伴在抖音这类布局比较随意的页面上,反而觉得有点不太适应了,页面浏览的习惯一下子被打乱,感觉焦点轨迹跟脑海中的预期对不上了,这也是完全正常的。
关于这个情况,我已经把一些核心的体验和诉求集中反馈给了官方。大家在使用的过程中如果也碰到了某些页面上浏览顺序不合理、感知突兀的情况,也可以梳理一下具体页面和场景,把线索汇总过来,我能帮到的一定会继续提交过去,也可以通过点明设置、联系我们,联系点明客服,以及加入点明软件官方QQ群:198248434进行反馈,或关注“点明科技”微信公众号,获取更多帮助信息。开发者现在还在可能根据反馈逐步打磨策略,这些真实的声音对他们来说是很关键的参考。
最后想多说一句。我认为这次对于焦点遍历规则的调整,某种意义上算是做了一个新的尝试和引领。让三方屏幕阅读器的焦点规则逐步向 TalkBack 靠拢,朝着统一的维度去对齐,其实是一个非常有价值的方向。试想一下,如果各家读屏的焦点遍历规则能够相对统一,那后续大家在反馈 App 无障碍问题时,就会有更一致的标准和参照,不再出现同一个页面在不同读屏上呈现效果各说各话的局面,这对于整个生态的规范化是有切实帮助的。希望后续其他的三方屏幕阅读器,也能够陆续在这个方向上跟进和探索。
从深层来看,这种从“逻辑顺序”向“空间顺序”的倾斜,其实是无障碍体验优化的一个主流趋势——系统在底层充当了翻译官,把原本面向开发者的代码逻辑顺序,转化为更贴合用户直觉感知的视觉空间顺序,让读屏的浏览体验跟眼睛看到的东西真正对应起来。大家升级之后,可以亲自滑动体验,感受下新旧版本浏览顺序的差别,在日常使用中如果发现适配问题,也可以把具体页面和场景梳理出来,这些真实的声音对开发者逐步打磨策略是很关键的参考。
想体验这次升级新变化的伙伴可以在点明市场升级点明安卓,然后到点明设置、读屏设置、更多设置,开启超级浏览和焦点智能排列进行体验。