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

また、ドラッグ可能な機能が意味すると推測するウィジェットのタッチイベントに応答したい場合、ここでの最善の策は、提供される一連のタッチ入力反応を使用することtouchBehaviorsですVisualNode。関係ない。したがって、これを行うには、それぞれのプロパティTouchBehaviorで定義されたオブジェクトを作成する必要があります。TouchReaction

したがって、たとえば、タッチダウン イベントを受信して​​タッチアップ イベントが発生するまでいくつかのタッチ イベントを追跡するには、それぞれのオブジェクトVisualNodeを定義し、イベント フィルターによってキャプチャされたすべてのイベントを取得するスロットに接続する必要があります。このアプローチを示すコードは次のとおりです。touchBehaviouronTouch()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 に答える