命中测试

概览

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

命中测试是一个过程,在此过程中,Sce 确定应将哪些命中路由到哪些客户端。

命中区域

客户提交的图形内容本身并不可以命中。而是附加到 Flatland 转换的矩形点击区域,可使内容视图接收输入事件。

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

语义可见性

Flatland 客户端可以附加到转换中的命中区域有两种:语义上可见和语义上不可见的命中区域。大多数客户端都可以忽略语义可见性的属性,因为它仅用在极少数的特定于无障碍功能的用例中。如需了解详情,请参阅语义可见性页面。

算法简要概览

假设在点 (x,y) 发生命中,包含与 (x,y) 相交的地理上最上层(拓扑上最后)命中区域的视图将接收命中。我们将要求分为各个组成部分。

排名靠前

如果给定的父转换和子转换包含内容,则子转换绘制在父转换之上,并且其还会以拓扑形式绘制在父转换之后。

假设有两个同级转换具有相同的父项,通过 AddChild() 添加的子项在拓扑上位于其同级项后面。

语义兼容性

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

如需了解详情,请参阅语义可见性页面。

雷同

位于命中区域边界上的命中会被视为已包含在该命中区域内。

如果两个或多个转换共用一个边框,则定界线会转到以拓扑方式的最后一个转换。

默认命中区域

虽然 View 本身默认情况下并非可命中,但 API 客户端往往希望内容在创建后可以进行交互,因此 Flatland 会在 View 通过 SetRootTransform() 调用安装其根转换时为其创建一个全屏默认命中区域 (DHR),除非客户端手动指定自己的命中区域。

DHR 的大小最大,因此将 View 调整得较大不会导致屏幕的某个部分无法命中。

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

  1. 当且仅当之前没有进行 SetHitRegions(T) 调用时,才会在 SetRootTransform(T) 调用期间向根转换 T 添加 DHR。
  2. 即使 |hit_region_vector| 为空,在调用 SetRootTransform(T) 之后调用 SetRootTransform(T) 时也会覆盖 DHR。
  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。你们有 DHR。