ユーザーが 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----
助けていただければ幸いです、ありがとう!