平地放大

放大功能是一项无障碍功能,可让客户放大呈现的内容,以帮助视障人士。例如,以用户光标为中心的小区域将在屏幕的其他地方以较高的比例显示,并且该区域将随着光标本身的移动而移动。全屏放大功能同样适用,顾名思义,放大的区域将呈现在整个显示屏上。

设计

实际上,Flatland 的 API 中没有明确的“放大”概念。取而代之的是,可以利用 Flatland 场景图的灵活性来实现放大功能,即,转换节点能够缩放其子树,而一个节点具有多个父节点。

局部放大

Flatland 以深度优先的方式遍历场景图,以生成要发送到渲染程序的最终数据列表。具有两个父级的节点将遍历两次,因此将在最终数据列表中显示两次,每个实例都会继承一组不同的全局数据,具体取决于针对该实例遍历的父级。由于渲染数据是重复的,因此一定要注意性能。系统还会挑选全屏可渲染对象背后的内容,这有助于解决此性能问题。

因此,为了实现放大,客户端可以设置多父项场景图,其中一个父项包含一个缩放比例,该缩放系数会放大 Flatland 向下遍历其特定子层次结构生成的所有实例。可以动态修改此放大节点以满足客户端的需求。例如,如果放大的区域需要跟随光标,则可以根据光标位置更新放大节点的平移组件,以产生屏幕上移动的放大区域的效果。

全屏放大功能

对于全屏放大,我们可以通过将单个父节点放大到所需的放大级别来实现。为特定视图提供给客户端的布局信息不会受到应用于父放大节点的缩放比例的影响。

放大流程示例

伪代码

以下是一些示例代码,演示了如何为局部放大设置场景。

// Create transform IDs.
const TransformId kIdRoot = {1};
const TransformId kIdParent1 = {2};
const TransformId kIdParent2 = {3};
const TransformId kIdChild = {4};

// Create the transforms.
flatland->CreateTransform(kIdRoot);
flatland->CreateTransform(kIdParent1);
flatland->CreateTransform(kIdParent2);
flatland->CreateTransform(kIdChild);

// Scale up the magnification parent node.
flatland->SetScale(kIdParent2, {20, 20});

// Setup the diamond parent hierarchy.
flatland->SetRootTransform(kIdRoot);
flatland->AddChild(kIdRoot, kIdParent1);
flatland->AddChild(kIdRoot, kIdParent2);
flatland->AddChild(kIdParent1, kIdChild);
flatland->AddChild(kIdParent2, kIdChild);

// Present flatland.
flatland->Present(/*args*/);