使用捏合操纵器可以使用户在 Kanzi 应用程序中缩放和旋转节点。例如,您可以使用捏合操纵器让用户缩放图形。请参阅为节点启用捏合手势。
使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。请参阅使用捏合操纵器 (Pinch Manipulator) 触发器。
捏合操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器。
通过完成教程学习如何使用捏合操纵器。请参阅教程:平移、缩放、轻敲。
要为节点启用捏合手势:



# 符号后跟别名名称访问别名目标节点。


private:
//为 PinchManipulator::StartedMessage 消息定义处理程序,该消息来自
//具有可生成捏合消息的输入操纵器的 2D 节点。
//此处理程序可为捏合手势准备 2D 节点。
void onPinchStarted(PinchManipulator::StartedMessageArguments& messageArguments)
{
//从消息参数获得用户捏合的节点。
Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
if (!node2d)
{
return;
}
//当开始节点上的捏合手势,让节点位于前面。
node2d->moveToFront();
//存储渲染变换 (Render Transformation) 比例的初始值。
SRTValue2D nodeTransform = node2d->getRenderTransformation();
m_pinchInitialScaleFactor = nodeTransform.getScale().getX() - 1.0f;
}
//定义 PinchManipulator::MovedMessage 消息的处理程序,该消息来自
//具有可生成捏合消息的输入操纵器的 2D 节点。
//这样可按捏合手势的量缩放和旋转 2D 节点。
void onPinchMoved(PinchManipulator::MovedMessageArguments& messageArguments)
{
//从消息参数获得用户捏合的节点。
Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
if (!node2d)
{
return;
}
float scale;
//从消息参数获取比例和旋转。
float scaleDelta = messageArguments.getScale();
float rotateDelta = messageArguments.getRotation();
//获取节点的渲染变换 (Render Transformation) 属性。
SRTValue2D nodeTransform = node2d->getRenderTransformation();
//通过添加初始比例到捏合值计算比例。
scale = scaleDelta + m_pinchInitialScaleFactor;
//应用旋转。
nodeTransform.rotate(rotateDelta);
//应用比例。
nodeTransform.setScale(Vector2(scale, scale));
//要让节点围绕中心而非左上角旋转,
//将渲染变换原点 (Render Transformation Origin) 属性设置为 (0.5, 0.5)。
node2d->setRenderTransformationOrigin(Vector2(0.5f, 0.5f));
//应用新变换到节点。
node2d->setRenderTransformation(nodeTransform);
}
//捏合手势的初始比例因子。
float m_pinchInitialScaleFactor;
MyProject() :
m_pinchInitialScaleFactor(0.0f)
{
}onProjectLoaded() 函数中创建 PinchManipulator 操纵器并订阅其消息。 virtual void onProjectLoaded() KZ_OVERRIDE
{
ScreenSharedPtr screen = getScreen();
Domain* domain = getDomain();
//使用别名获取PinchNode 节点。
NodeSharedPtr pinchNode = screen->lookupNode<Node>("#PinchNode");
//创建生成捏合消息的输入操纵器。
PinchManipulatorSharedPtr pinchManipulator = PinchManipulator::create(domain);
//添加输入操纵器到PinchNode。
pinchNode->addInputManipulator(pinchManipulator);
//订阅PinchNode 的 PinchManipulator::StartedMessage 消息。
// PinchManipulator 在用户在附加节点按下两根手指时生成此消息。
pinchNode->addMessageHandler(PinchManipulator::StartedMessage, bind(&MyProject::onPinchStarted, this, placeholders::_1));
//订阅 PinchNode 的 PinchManipulator::MovedMessage 消息。
//PinchManipulator 在超出比例或旋转阈值时首次生成此消息,
//然后在被跟踪触摸在更新之间移动时生成此消息。
pinchNode->addMessageHandler(PinchManipulator::MovedMessage, bind(&MyProject::onPinchMoved, this, placeholders::_1));
}使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。
捏合操纵器 (Pinch Manipulator) 有这些触发器:
要使用捏合操纵器 (Pinch Manipulator) 触发器:



有关详细信息,请参阅 API reference中的 PinchManipulator 类。