我需要创建一个可拖动的按钮。阻力从多个源开始并在接收器处结束。有没有办法在创建页面后获取源和接收器的位置。
Container {
horizontalAlignment: HorizontalAlignment.Fill
Label {
id: preId
preferredWidth: 700
text: rootContainer.data.part1
multiline: true
textStyle {
textAlign: TextAlign.Center
color: Color.Black
}
horizontalAlignment: HorizontalAlignment.Center
}
}
Container {
horizontalAlignment: HorizontalAlignment.Center
SinkButton {
id: sinkId
preferredHeight: 100
preferredWidth: 686
textColor: Color.Black
enabled: false
layoutProperties: AbsoluteLayoutProperties {
}
}
}
Container {
horizontalAlignment: HorizontalAlignment.Fill
topPadding: -5
bottomPadding: squareDisplay ? 10 : 50
Label {
id: postId
text: rootContainer.data.postData
multiline: true
textStyle {
textAlign: TextAlign.Center
color: Color.Black
}
horizontalAlignment: HorizontalAlignment.Center
}
}
}
我想知道“sinkId”相对于窗口的位置。它的位置取决于“preId”文本长度。 LayoutUpdateHandler
是一种可能的解决方案,但layoutFrame.x
或layoutFrame.y
在检查时始终为零。有没有办法在页面创建之后获得任何视觉节点的位置?
答案 0 :(得分:1)
首先,LayoutUpdateHandler
报告layoutFrame
属性非常好,不确定为什么它不适用于您的情况。以下是工作代码,证明如果您想根据自己的需要使用此课程:
import bb.cascades 1.0
Page {
Container {
layout: DockLayout {}
horizontalAlignment: HorizontalAlignment.Fill
verticalAlignment: VerticalAlignment.Fill
Button {
id: button
horizontalAlignment: HorizontalAlignment.Center
verticalAlignment: VerticalAlignment.Center
text: "click me"
onClicked: {
console.log("Button layout - x:" + layoutHandler.layoutFrame.x + ", y:" + layoutHandler.layoutFrame.y +
", width:"+ layoutHandler.layoutFrame.width + ", height: " + layoutHandler.layoutFrame.height);
}
attachedObjects: [
LayoutUpdateHandler {
id: layoutHandler
}
]
}
}
}
此外,如果你想回应你的小部件的触摸事件,我想可拖动的功能意味着,这里最好的选择是使用touchBehaviors
提供的一系列触摸输入反应,这些反应可以添加到任何通过QML作为通过C ++的VisualNode
并不重要。因此,为了做到这一点,您需要创建一个TouchBehavior
对象,其中包含具有相应属性的已定义TouchReaction
。
因此,举例来说,为了在接收到触摸事件时跟踪某些VisualNode
的触摸事件,直到发生触摸事件,您需要定义相应的touchBehaviour
对象并连接到{{1 } onTouch()
的广告位,您可以获取VisualNode
事件过滤器捕获的所有事件。以下是演示此方法的代码:
touchBehaviour
然后你可以在import bb.cascades 1.0
Page {
Container {
layout: DockLayout {}
horizontalAlignment: HorizontalAlignment.Fill
verticalAlignment: VerticalAlignment.Fill
Button {
id: button
horizontalAlignment: HorizontalAlignment.Center
verticalAlignment: VerticalAlignment.Center
text: "click me"
touchBehaviors: [
TouchBehavior {
TouchReaction {
eventType: TouchType.Down
phase: PropagationPhase.AtTarget
response: TouchResponse.StartTracking
}
}
]
onTouch: {
console.log("===== got touch event of type " + event.touchType + " =====");
console.log("\twindowX - " + event.windowX);
console.log("\twindowX - " + event.windowX);
console.log("\twindowY - " + event.windowY);
console.log("\tlocalX - " + event.localX);
console.log("\tlocalY - " + event.localY);
console.log("\n");
}
}
}
}
槽处理程序中添加逻辑。
有关该主题的其他信息:
答案 1 :(得分:0)
LayoutUpdateHandler将告诉您元素相对于父元素的位置,在SinkId的情况下,它是一个包装它的Container。在这种情况下,LayoutUpdateHandler将始终返回0。
删除容器并直接在sinkId上设置horizontalAlignment:HorizontalAlignment.Center属性并使用LayoutUpdateHandler,或者在sinkId周围的容器上使用LayoutUpdateHandler。