命中测试

概览

命中是指指针事件与图形视图之间的交互点。

在点击测试过程中,景观团队会决定应传送哪些命中 与哪些客户端相关联

命中区域

客户端提交的图形内容本身是无法点击的。相反, 是附加到 Flatland 转换的矩形点击区域, 来接收输入事件。

为便于开发者使用 Flatland API,每个视图都有一个默认命中 区域。这些命中区域充当常规命中区域,但会隐式添加到 调用 SetRootView() 中的根转换。请参阅 默认命中区域部分。

语义可见性

Flatland 客户端可附加到转换的命中区域有两种: 语义可见和语义上不可见的命中区域。属性 语义可见性可以被大多数客户端忽略,因为它只在极少数情况下使用 无障碍功能特有的应用场景请参阅 语义可见性 页面。

算法简要概览

在给定 (x,y) 点发生命中后,包含地理位置最顶层的 (拓扑上最后一个)与 (x,y) 相交的语义上兼容的命中区域 收到命中。我们把要求分成几个组成部分。

最热门

如果给定包含内容的父转换和子转换,子转换将绘制在 在父转换的顶部,在拓扑上也在父转换之后。

给定两个具有相同父项的同级转换,子项通过以下方法添加了 last AddChild() 在拓扑上位于其同级之后。

语义兼容性

语义命中测试不会与语义上不可见的命中区域进行交互。

请参阅语义可见性 页面。

重叠

位于命中区域边界上的命中会被视为 。

如果两个或多个转换共用一个边框,则确定规则将转到 最后进行拓扑转换。

默认命中区域

虽然视图本身默认情况下并非可命中,但 API 客户端往往期望 内容在创建后可交互,因此 Flatland 可以创建一个全屏 通过 SetRootTransform() 调用(除非客户端手动指定自己的命中) 区域。

DHR 会达到最大尺寸,因此将视图尺寸调大一点应该不会导致 变得无命中

默认命中区域的语义可总结为以下规则:

  1. 在调用 SetRootTransform(T) 期间,将一个 DHR 添加到根转换 T 当且仅当先前没有 SetHitRegions(T) 调用时
  2. 在 SetRootTransform(T) 之后调用 SetHitRegions(T, Hit_region_vector) 调用将覆盖 DHR,即使 |hit_region_vector|为空。
  3. 系统只会为给定的根转换安装 DHR,只要它是根转换即可 视图。
  4. 给定转换 T 的 DHR 不受任何命中区域操作的影响 任何其他转换,即 U。

为帮助说明语义,我们来看一些示例。

场景 1

SetRootTransform(T)

结束状态:T 有一个 DHR。

场景 2

SetRootTransform(T)

SetRootTransform(U)

结束状态:T 没有命中区域,U 有 DHR。

场景 3

场景 3A

SetRootTransform(T)

SetHitRegions(T, {HR1})

场景 3B

SetHitRegions(T, {HR1})

SetRootTransform(T)

3A 和 3B 的结束状态:T 有一个命中区域 HR1。没有 DHR。

场景 4

SetRootTransform(T)

SetHitRegions(T, { {} })

结束状态:T 没有命中区域

场景 5

SetRootTransform(T)

SetRootTransform(U)

SetHitRegions(T, {HR1, HR2})

结束状态:T 有两个命中区域,HR1 和 HR2。U 具有 DHR。