1

我需要创建一个可拖动的按钮。拖动从多个源开始,在接收器结束。创建页面后有什么方法可以获取源和接收器的位置。

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总是在检查时为零。有没有办法在页面创建时/之后获取任何可视节点的位置?

4

2 回答 2

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
                }
            ] 
        }
    }
}

此外,如果您想响应您的小部件的触摸事件,我猜这是可拖动功能的意思,最好的办法是使用一系列触摸输入反应,这些反应可以通过 QML 或通过 C++touchBehaviors添加到任何东西,不VisualNode没关系。因此,为了做到这一点,您需要创建一个具有相应属性TouchBehavior定义的对象。TouchReaction

因此,例如,为了VisualNode在接收到触摸事件时跟踪某些触摸事件,直到发生触摸事件,您需要定义一个相应的touchBehaviour对象并连接到您获取事件过滤器捕获的所有事件的onTouch()插槽。下面是演示这种方法的代码:VisualNodetouchBehaviour

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");
            }
        }
    }
}

onTouch()然后你可以在槽处理程序中添加你的逻辑。

关于该主题的其他信息:

于 2013-07-17T00:39:41.630 回答
0

LayoutUpdateHandler 将告诉您元素相对于父元素的位置,在 SinkId 的情况下,它是一个包装它的容器。在这种情况下,LayoutUpdateHandler 将始终返回 0。

删除容器并直接在 sinkId 上设置 Horizo​​ntalAlignment:Horizo​​ntalAlignment.Center 属性并使用 LayoutUpdateHandler,或者在围绕 sinkId 的容器上使用 LayoutUpdateHandler。

于 2013-07-23T04:16:55.873 回答