0

要素をドラッグしたい HGroup があります。HGroup のスタイルを設定するために、実際には Rect と HGroup を含むグループです。

このコードのドラッグ領域は、現在グループ内にある要素と同じ大きさしかありません (そのため、テストのためにそこにボタンを配置しました)。ご覧のとおり、Group と HGroup の幅を手動で設定しました。すべてが本来あるべき 300 幅であると報告しますが、ドラッグ領域は HGroup 内の要素の数と同じ大きさのままです。これは、HGroup が実際に報告されているものではないと思わせます (.width設定後にプロパティにアクセスすると 300 と報告されます)。Rect は適切に 300 幅なので、ドロップ ゾーンがどうあるべきかがわかります。

明らかに間違ったことをしているに違いない気がしますが、それがわかりません。どんなアイデアでも大歓迎です!

編集:ある種のマスキングの問題があるのだろうか。四角形にドラッグ入力イベントを追加しても (私が見ることができるように、適切なサイズであることがわかっています)、入力イベントは発生しません。どうすればこれを見つけることができますか?

package components
{
    import mx.core.IUIComponent;
    import mx.events.DragEvent;
    import mx.graphics.SolidColor;
    import mx.managers.DragManager;

    import spark.components.Group;
    import spark.components.HGroup;
    import spark.components.VGroup;
    import spark.primitives.Rect;


    public class TestVerticalConstraintExpression extends Group
    {
        private var expressions:VGroup;
        private var topExpression:Group;
        private var locked:Boolean = false;

        public function TestVerticalConstraintExpression()
        {
            super();

            this.width = 300;

            expressions = new VGroup();
            expressions.width = 300;

            this.addElement(getBackground());

            topExpression = new HGroup();

            expressions.addElement(topExpression);

            this.addElement(getBackground());
            this.addElement(expressions);

            topExpression.width = 300;
            topExpression.height = 50;
            topExpression.addElement(new ConstraintButton());

            // Setup listeners for when things are dropped onto the expression group
            topExpression.addEventListener(DragEvent.DRAG_ENTER,
                dragEnterHandler);
        }

        protected function getBackground():Rect
        {
            var bg:Rect = new Rect();
            bg.fill = new SolidColor(Math.round(Math.random()*0xFFFFFF));
            bg.left = 0;
            bg.right = 0;
            bg.top = 0;
            bg.bottom = 0;
            bg.percentWidth = 100;
            bg.percentHeight = 100;

            return bg;
        }

        protected function dragEnterHandler(event:DragEvent):void {
            DragManager.acceptDragDrop(event.currentTarget as IUIComponent);
        }
    }
}
4

1 に答える 1

1

AGroupは基本的に単なるレイアウトコンテナです。グラフィック要素がまったくないため、を配置した場所を除いて完全に透明になります。ConstraintButtonそのため、にドロップすることしかできずConstraintButton、他の場所にはドロップできませんHGroup

したがって、HGroupと同じサイズのグラフィック要素を使用して「ヒットゾーン」を作成する必要があります。表示されないようにalphaプロパティが設定され0ている場合がありますが、それでも対話できます。私が考えることができる2つの最も簡単な方法:

  • HGroupであなたをに変換しBorderContainerますHorizontallayout
  • HGroup背景とGroup一緒に入れRectます; このようなもの:

<s:Group id="topExpression">
    <s:Rect left="0" right="0" top="0" bottom="0">
        <s:fill>
            <s:SolidColor alpha="0" />
        </s:fill>
    </s:Rect>

    <s:HGroup id="yourOldTopExpression" left="0" right="0" top="0" bottom="0" />
</s:Group>

そうは言っても、なぜActionScriptで「ビュー」を書きたいのですか?これにより、コードが非常に冗長になり(つまり、作業量が増え)、読みにくくなります。言うまでもなくRect、メインGroupに背景を2回追加するなど、間違いを犯します。これは、コードがMXMLで記述されている場合にすぐに見つけられたはずです。
そしておそらくもっと重要なのは、サブコンポーネント作成コードをメインクラスのコンストラクターに配置するため、コードによって実際にパフォーマンスが低下することです。純粋なActionScriptでコンポーネントを作成する場合は、Flexコンポーネントのライフサイクルを理解しておく必要があります。MXMLは、このすべての要点を処理します。
MXMLとActionScriptの混同が心配な場合は、Sparkスキニングアーキテクチャについて読む必要があります。(その例として、Sparkスキニングを使用するこの回答を確認できます:カスタムコンポジットコントロールは、VGROUPに追加されてから0.5〜1秒間だけ正しくレンダリングされません)。

于 2012-11-09T10:56:58.130 に答える