协议
ViewTreeWatcher
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
一种获取特定视图(“上下文视图”及其子视图(如果有)的视图树快照)的方法。返回的数据是观察期间的一系列快照,从客户端之前 Watch() 调用的 epoch_end(即 zx.Time 0)开始,到当前 epoch_end 结束。时基为 ZX_CLOCK_MONOTONIC。
客户端通常从测试内获取 ViewTreeWatcher
功能,在测试环境之外通常不可能获得。如需了解详情,请参阅 fuchsia.ui.observation.test.Registry
和 fuchsia.ui.test.scene.Controller
。
使用说明。借助此协议,客户端可以监视其有权使用的视图树的更改。例如,如果客户端拥有视图 A,则 A 充当 A 的子树(即“根视图”)的上下文视图,其中 A 是视图 B 的父视图,而视图 B 是视图 C 的父视图。然后,客户端可以观察 A、B 和 C 这三个位置的关键生命周期事件,例如新连接的视图、视图位置和大小的变化等。这样,客户端就可以以可靠且符合人体工程学的方式控制对视图树更改的操作。例如,客户端可以等待后代视图 C 建立连接,然后再请求将焦点转移到 C。
配置:上下文视图在此协议之外确定。
频率:客户端可以每帧接收一个或多个快照。客户端不应“对快照进行计数”,因为每帧的快照计数可能是不确定的。相反,客户端应查找快照状态的特定条件。
颁发:如果上下文视图与屏幕断开连接,系统不会代表上下文视图发出任何帧,Watch() 调用将静默地运行。
生命周期:服务器端点在上下文视图终止时关闭。
观看
一种获取特定视图的视图树快照的方法。
此调用表示为“挂起 get”模式:客户端请求一组最近的快照,并通过回调接收这些快照。这种基于拉取的方法可确保客户端按自己的节奏使用事件;事件不会无限的方式堵塞通道。
错误处理。如果未设置 Error,则客户端可能会假定响应包含在其周期内包含完整信息的更新。
流控制。调用方一次最多只能有一个进行中的 |Watch| 调用;并发调用 |Watch| 是一个逻辑错误。不合规会导致频道关闭。
客户节奏。服务器将尽可能无损、尽最大努力将快照发送给调用方,但调用方必须分配足够的时间来跟上新的快照。
请求
<EMPTY>
响应
名称 | 类型 |
---|---|
payload |
WatchResponse
|
结构
AlignedExtent
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
视图的边界框,以视图自己的坐标系描述。具体而言,|AlignedExtent| 用于描述视图边界框的最小和最大点,该边界框是矩形且与轴对齐。
注意:如需在另一个视图的坐标系中描述某个视图的边界框,请参阅 |RotatableExtent|。
原点为最小值。大小为:(abs(max.x - min.x), abs(max.y - min.y))。
字段 | 类型 | 说明 | 默认 |
---|---|---|---|
min |
fuchsia.math/PointF
|
视图边界框的最小位置。 |
无默认值 |
max |
fuchsia.math/PointF
|
视图边界框的最大位置。 |
无默认值 |
布局
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
视图的几何图形数据。
请注意,这些值是服务器端值,并且某些图形 API 在这些值“生效”前后无法保证与界面客户端之间的一致性保证。也就是说,可能需要直接查询界面客户端,以了解其当前使用的值。不过,界面客户端应在几帧内“立即”使用这些值。
字段 | 类型 | 说明 | 默认 |
---|---|---|---|
extent |
AlignedExtent
|
视图边界框的最小和最大点(在该视图的坐标系中)。 |
无默认值 |
pixel_scale |
PixelScale
|
从物理像素(屏幕)到逻辑像素(视图坐标系)的转换比率。 |
无默认值 |
inset |
fuchsia.math/InsetF
|
视图边界框的偏移量数据(在该视图的坐标系中)。 |
无默认值 |
RotatableExtent
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
视图边界框,用另一个视图的坐标系描述。具体而言,|RotatableExtent| 描述了视图边界框的原点、大小和关于原点的旋转角度。
注意:如需在视图自身坐标系中描述视图的边界框,请参阅 |AlignedExtent|。
我们使用“V”表示正在描述的视图,使用“W”表示正在描述 V 的视图。
请注意,虽然 |angle| 可以任意设置,但典型用法是与轴对齐。可按顺时针顺序确定 V 的边界框 (, . . . . . , . . o , . . o , . . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , . o , .
字段 | 类型 | 说明 | 默认 |
---|---|---|---|
origin |
fuchsia.math/PointF
|
V 边界框的起点(采用 W 坐标系)。 |
无默认值 |
width |
float32
|
V 的边界框的宽度(沿 V 的 x 轴增加的方向),在 W 的坐标系中。 |
无默认值 |
height |
float32
|
V 的边界框的高度(沿 V 的 y 轴增加的方向),在 W 的坐标系中。 |
无默认值 |
angle_degrees |
float32
|
围绕原点顺时针旋转的角度(以度为单位)。 |
无默认值 |
表格
ViewDescriptor
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
特定视图的数据:标识符、位置和子级。
序数 | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
view_ref_koid |
zx/Koid
|
此视图的 fuchsia.ui.views.ViewRef koid。 |
2 |
layout |
Layout
|
该视图的原点、逻辑大小、像素比例和边衬区数据(采用视图自身坐标系)。 限制。服务器和客户端之间的数据一致性取决于特定的图形 API。一些 API 提供弱一致性,在这种情况下,服务器端数据(此类数据)和客户端数据(在视图的界面客户端中)可以在一段时间内不同的。 |
3 |
extent_in_context |
RotatableExtent
|
该视图在上下文视图坐标系中的范围。它不描述子视图的逻辑大小。 此属性描述此视图在上下文视图中的“标准答案”位置,而不考虑视图树深度或中间视图的特定布局状态。 限制。它不说明视图是否“可见”(例如,视图是应用了不透明度,还是未被其他视图遮挡),也无法说明视图是否“可命中”(例如,视图是否完全放置在每个祖先视图的边界框内)。 |
4 |
extent_in_parent |
RotatableExtent
|
父视图坐标系中占用的空间。它不描述子视图的逻辑大小。 |
5 |
children |
vector<uint32>[300]
|
子视图的列表,按照图形 API 已知的顺序排列。 此矢量中的每个整数都是指父级在 |views| 或 |incomplete| 矢量中的位置。 每个子视图的身份、位置和尺寸。位置和大小由子视图在父视图坐标系中的范围描述。 视图树拓扑是可靠的。放置在此处的子视图相当于父视图收到了“子视图已连接”信号。 限制。子级视图边界通过父视图的坐标系进行描述,这会受到弱一致性(具体取决于图形 API)。也就是说,当父视图的大小或指标发生变化时,上下文视图可能会观察到“跳跃”,因为父视图会纳入这些数据。在这种情况下,系统会发出新的 ViewTreeSnapshot 来说明相对于上下文视图的位置变化。 |
ViewTreeSnapshot
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
上下文视图及其后代视图(如果有)的说明。
序数 | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
time |
zx/Time
|
快照的截取时间。时基是单调时间。 |
2 |
views |
vector<ViewDescriptor>[300]
|
上下文视图(位于元素 0 处)及其后代视图的完整列表。 如果超出 |
WatchResponse
在 fuchsia.ui.observation.geometry/watcher.fidl 中定义
fuchsia.ui.observation.geometry.ViewTreeWatcher.Watch 的响应。
序数 | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
epoch_end |
zx/Time
|
发送响应的时间。时基是单调时间。 |
2 |
updates |
vector<ViewTreeSnapshot>[200]
|
特定视图的最近更新列表。 |
3 |
error |
Error
|
仅在检测到错误情况时设置。如果未设置,客户端可能会假定更新在其周期内具有完整信息。 |
BITS
柔性错误
类型:uint32
在 fuchsia.ui.observation.启动几何/watcher.fidl 中定义
名称 | 值 | 说明 |
---|---|---|
CHANNEL_OVERFLOW |
1 | 如果在 |
BUFFER_OVERFLOW |
2 | 如果在 |
VIEWS_OVERFLOW |
4 | 当 |
常量
名称 | 值 | 类型 | 说明 |
---|---|---|---|
BUFFER_SIZE |
200
|
uint32 |
客户端可以在 由于 FIDL 通道的大小限制,因此 注意:修改 |
MAX_VIEW_COUNT |
300
|
uint32 |
客户端可以在 由于 FIDL 通道的大小限制, 注意:修改 |
别名
名称 | 值 | 说明 |
---|---|---|
PixelScale |
array [2 ] |
(屏幕的)物理像素与(视图的坐标系)的逻辑像素的比率。
|