1

ユーザーが 60% から 200% にスケーリングできるようにしたい AIR アプリケーションがあります。アプリケーションのスケーリングを制御するオプション メニューにスライダーを追加しました。アプリケーション全体を適切にスケーリングする方法について混乱しており、少し助けが必要です。かなり長い間これを行ってきました。

この簡単なテストのコードは次のとおりです。どこにでもトレースを追加し、サイズ変更イベントにリスナーを配置することで、基本的に、ウィンドウの scaleX と scaleY の値を設定しても、ステージの scaleX と scaleY は変更されないことがわかりました。ただし、これらのステージ値は編集できず、編集しようとするとエラーがスローされます。

そこで、stage.stageWidth と stage.stageHeight を、stage.width と stage.height に合わせて調整してみました。しかし、そうすると、ウィンドウの内容が再びスケーリングされます。

基本的に、100% を超えるもの、または minWidth と minHeight を使用すると、ウィンドウ内のコンポーネントが部分的に切り取られてクリッピングされます。ステージと同じ高さ。

<?xml version="1.0" encoding="utf-8"?>
<s:Window xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" width="250" height="300"
          minWidth="260" minHeight="280"
          showStatusBar="false"
          systemChrome="none" transparent="true"
          initialize="_init()" creationComplete="_initPostCreation()"
          maximizable="false" minimizable="false" xmlns:Components="assets.skins.CompOverlay.Components.*">

    <fx:Declarations>
    </fx:Declarations>

    <s:VGroup left="2" top="2" right="2" bottom="2" gap="0">        
        <s:Label width="100%" textAlign="center" text="Window Scale" fontSize="14" />
        <s:HGroup width="100%">
            <s:HSlider id="winScale" minimum="0.6" maximum="2" width="80%" snapInterval="0.01" showDataTip="false" change="_winScale(event)" />
            <s:Label width="20%" fontSize="14" textAlign="center" text="{Math.round(winScale.value*100) + '%'}"/>
        </s:HGroup>     
    </s:VGroup>

    <fx:Script>
        <![CDATA[
            import mx.events.ResizeEvent;

            private function _init():void
            {

            }

            private function _initPostCreation():void
            {
                this.addEventListener(Event.CLOSING, this._destructor);

                this.stage.scaleMode = StageScaleMode.NO_SCALE;
                this.stage.addEventListener(Event.RESIZE, _onResize);
                this.addEventListener(ResizeEvent.RESIZE, _onWinResize);
                this.stage.align = StageAlign.TOP_LEFT;
            }

            private function _destructor(event:Event):void
            {               
                this.removeEventListener(Event.CLOSING, this._destructor);
                this.stage.removeEventListener(Event.RESIZE, _onResize);
                this.removeEventListener(ResizeEvent.RESIZE, _onWinResize);
            }

            private function _winScale(event:Event):void
            {
                this.scaleX = event.target.value;
                this.scaleY = this.scaleX;
                this.width = (260*this.scaleX);
                this.height = (300*this.scaleY);
                trace(this.width, this.height);
                trace(this.scaleX, this.scaleY);
            }

            private function _onResize(event:Event):void
            {
                trace('start resize----');
                trace('stage.width = '+this.stage.width, 'stage.height = '+this.stage.height);
                trace('stage.stageWidth = '+this.stage.stageWidth, 'stage.stageHeight = '+this.stage.stageHeight);
                if (this.initialized) {
                    if (this.stage.width != this.stage.stageWidth) {
                        this.stage.removeEventListener(Event.RESIZE, _onResize);

                        this.stage.stageWidth = this.stage.width;
                        this.stage.stageHeight = this.stage.height;

                        this.stage.addEventListener(Event.RESIZE, _onResize);
                    }
                    trace('stage.width = '+this.stage.width, 'stage.height = '+this.stage.height);
                    trace('stage.stageWidth = '+this.stage.stageWidth, 'stage.stageHeight = '+this.stage.stageHeight);
                    trace('stage.scaleX = '+this.stage.scaleX, 'stage.scaleY = '+this.stage.scaleY);
                }
                trace('end resize----');
            }

            private function _onWinResize(event:ResizeEvent):void
            {
                trace ('window resize event');
                if (this.stage.width != this.stage.stageWidth) {
                    event.stopPropagation();
                    trace('prop stopped');
                }
            }

        ]]>
    </fx:Script>
</s:Window>

ウィンドウのサイズを数回変更すると、次のトレース出力が得られます。

start resize----
stage.width = 291.5 stage.height = 316.9
stage.stageWidth = 275 stage.stageHeight = 297
window resize event
prop stopped
window resize event
prop stopped
stage.width = 308.45 stage.height = 337.05
stage.stageWidth = 291 stage.stageHeight = 316
stage.scaleX = 1 stage.scaleY = 1 stage.scaleMode = noScale
end resize----
window resize event
prop stopped
start resize----
stage.width = 308.45 stage.height = 339.2
stage.stageWidth = 291 stage.stageHeight = 318
window resize event
prop stopped
window resize event
prop stopped
stage.width = 326.5 stage.height = 361.45
stage.stageWidth = 308 stage.stageHeight = 339
stage.scaleX = 1 stage.scaleY = 1 stage.scaleMode = noScale
end resize----

助けていただければ幸いです、ありがとう!

4

0 に答える 0