3

私がやろうとしていることのほんの少しの背景。日付を表示するスタイル設定可能なテキスト フィールドがあるカスタム スキンがあります。日付にバインドされたスタイル可能なテキスト フィールドをクリックすると、日付スピナーが表示されます。日付スピナーの背後に、クリックを検出して日付スピナーを消すことができるように、画面全体をカバーする必要があるスプライトを描画します。

今問題-

get width または get height をオーバーライドしないと、画面全体を埋めることができませんでした。ただし、これを行うと、オーバーライドから高さを取得するため、日付スピナーが壊れます。1 つのコンポーネントだけをオーバーライドし、他のすべてのコンポーネントをデフォルト値に設定する方法を誰かが知っているかどうか疑問に思っています。これは初心者の質問のように思えるかもしれませんし、明らかな何かが欠けているかもしれません.as3はほとんど初めてです。

ここにいくつかのコードがあります-

override protected function createChildren():void {
        super.createChildren();
            if(!img) {
                img = new dateButtonBG();
                addChild(img);
            }

            if (!maskSprite) {
                maskSprite =  new Sprite();
                maskSprite.graphics.beginFill(0xFFFFCC, .5);
                maskSprite.graphics.drawRect(-((stage.height)/2),-((stage.width)/2), stage.width, stage.height);
                maskSprite.graphics.endFill(); 
            }

if(!dateButton) {
                dateButton = new StyleableTextField();
                todayDate = new Date();
                BindingUtils.bindProperty(dateButton, "text", date, "selectedDate");
                dateButton.addEventListener(MouseEvent.CLICK, onDateButtonClick);
                addChild(dateButton);
            }
invalidateDisplayList();
}

protected function removeSpinner( event:Event):void{
            maskSprite.removeEventListener(MouseEvent.CLICK, removeSpinner);
            removeChild(date);
            removeChild(maskSprite);
        }

protected function onDateButtonClick (event:Event):void {
            addChild(maskSprite);
            addChild(date);
            maskSprite.addEventListener(MouseEvent.CLICK, removeSpinner);
        }

override public function get width () : Number {
            return _width;
        }

override public function get height () : Number {
            return _height;
        }

コードは完全ではありませんが、私の主張を理解するためのものです。読んでくれてありがとう。

編集 - 私はそれを行う方法を考え出しました。誰かが同じ問題を抱えている場合に備えていくつかの情報を追加します - Flex はスプライト (または任意の UI コンポーネント) のサイズをコンテナーのサイズに制限します。コンテナのサイズを超えようとすると、コンテナのサイズが返されます。私のコードでは-

override public function get width () : Number {
            return _width;
        }

override public function get height () : Number {
            return _height;
        }

これは、コンテナーのサイズを超えるための修正として一般的に宣伝されています。ただし、幅と高さを要求するすべてのものをオーバーライドするため、このアプローチには欠陥があります。この場合、すべてを _height と _width のサイズにしようとします。複数のコンポーネントを持つスキンの場合、これは大きな問題です。アイテムのサイズを個別に設定しようとすることができますが、私にとってはうまくいかなかったか、別のアプローチを見つけました。これが機能するものです-

public override function validateDisplayList():void {
            super.validateDisplayList();
            yourComponent.width = someConstantW;
            yourComponent.height = someConstantH;
        }

ただし、これでは十分ではありません。この試行のために、コンポーネントをコンテナーの外に移動する必要がある場合があります-

override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void {
                super.layoutContents(unscaledWidth, unscaledHeight);
                setElementPosition(yourComponent, x, y);
            }

うまくいけば、私は誰かの数時間の作業を節約できました:)

4

1 に答える 1

0

投稿したコードからは明確ではありませんが、おそらくandの代わりにメソッドをオーバーライドする必要がありupdateDisplayList()ます。widthheight

updateDisplayList()は、コンポーネントが子オブジェクトのサイズと位置を決定するために実装するFlexライフサイクルメソッドです。

updateDisplayList()Flexフレームワークによって呼び出され、2つの値を渡します:unscaledWidthunscaledHeight。の実装でupdateDisplayList()は、これらの値を尊重し、それに応じて子オブジェクトのサイズ/位置を指定する必要があります。実際のサイジング/ポジショニングを行うには、他のライフサイクル方法(以下に表示)を使用する必要があります。

開始するための実装例を次に示します。ご提供いただいたコードスニペットがよくわからないため、少しずれている可能性があります。

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);
    // size/position the background (or whatever it is that should occupy the whole screen)
    background.setLayoutBoundsPosition(0,0); // unnecessary because 0,0 is default
    background.setLayoutBoundsSize(unscaledWidth, unscaledHeight);
    // size/position the text in the center
    var textWidth:Number = text.getPreferredBoundsWidth;
    var textheight:Number = text.getPreferredBoundsHeight
    text.setLayoutBoundsPosition( (unscaledWidth - textWidth)/2, (unscaledHeight - textHeight)/2 );
    text.setLayoutBoundsSize(textWidth, textHeight); // probably not necessary

}
于 2012-10-19T17:23:29.763 に答える