如何在页面呈现后获取任何可视节点的位置(X,Y)?

时间:2013-07-15 14:48:41

标签: qml blackberry-10 blackberry-cascades

我需要创建一个可拖动的按钮。阻力从多个源开始并在接收器处结束。有没有办法在创建页面后获取源和接收器的位置。

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.xlayoutFrame.y在检查时始终为零。有没有办法在页面创建之后获得任何视觉节点的位置?

2 个答案:

答案 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上设置horizo​​ntalAlignment:Horizo​​ntalAlignment.Center属性并使用LayoutUpdateHandler,或者在sinkId周围的容器上使用LayoutUpdateHandler。