私がやろうとしていることのほんの少しの背景。日付を表示するスタイル設定可能なテキスト フィールドがあるカスタム スキンがあります。日付にバインドされたスタイル可能なテキスト フィールドをクリックすると、日付スピナーが表示されます。日付スピナーの背後に、クリックを検出して日付スピナーを消すことができるように、画面全体をカバーする必要があるスプライトを描画します。
今問題-
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);
}
うまくいけば、私は誰かの数時間の作業を節約できました:)