Как получить размеры сцены с помощью StageScaleMode.SHOW_ALL? - PullRequest
4 голосов
/ 29 марта 2011

Если вы установите для stage.scaleMode значение StageScaleMode.SHOW_ALL, ваш swf может быть увеличен или уменьшен, а также может быть дополнен сверху / снизу или слева / справа. Однако stage.width + height всегда возвращают ширину и высоту, определенные вашим swf, а stage.scaleX + Y всегда возвращает 1. Как я понимаю, события изменения размера не генерируются. Так, как я могу получить фактический масштаб и размеры?

Я хочу их для двух задач:

  1. Я хочу заполнить этот отступ сверху / снизу или влево / вправо чем-то, только если пользователь может это видеть.

  2. Я рисую векторы в растровые изображения и хочу правильно масштабировать их, чтобы они не выглядели неровными (или размытыми с bitmap.smoothing). Кажется, что Flash правильно выполняет масштабирование, когда вы cacheAsBitmap = true, так как мне восстановить это?

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

В вашем случае, вероятно, было бы проще использовать StageScaleMode.NO_SCALE и самостоятельно кодировать изменение размера:

stage.addEventListener(Event.RESIZE, onStageResize);
private function onStageResize(event : Event) : void 
    {
    var stageW : int = stage.stageWidth;
    var stageH : int = stage.stageHeight;

    var contentW : int = yourVisibleContent.width;
    var contentH : int = yourVisibleContent.height;

    // resize it to fit
    var canvasAspectRatio : Number = stageW / stageH;
    var contentAspectRatio : Number = contentW / contentH;
    if(canvasAspectRatio > contentAspectRatio)
    {
        yourVisibleContent.height = stageH;
        yourVisibleContent.width = yourVisibleContent.height * contentAspectRatio;
    } else {

        yourVisibleContent.width = stageW;
        yourVisibleContent.height = yourVisibleContent.width / contentAspectRatio;
    }

    // center it:
    yourVisibleContent.x = (stageW - yourVisibleContent.width) / 2;
    yourVisibleContent.y = (stageH - yourVisibleContent.height) / 2;

    // fill remaining space with black:
    graphics.beginFill(0x000000);
    if(canvasAspectRatio > contentAspectRatio)
    {
        var horizontalEmptySpace : Number = stageW - yourVisibleContent.width;
        graphics.drawRect(0, 0, horizontalEmptySpace / 2, stageH);
        graphics.drawRect(stageW - horizontalEmptySpace / 2, 0, horizontalEmptySpace / 2, stageH);
    }else{
        var verticalEmptySpace : Number = stageH - yourVisibleContent.height;
        graphics.drawRect(0, 0, stageW, verticalEmptySpace / 2);
        graphics.drawRect(0, stageH - verticalEmptySpace / 2, stageW, verticalEmptySpace / 2);
    }

    // now you can also redraw your bitmaps with higher resolutions
    // it is easy to read the scale of your content with: yourVisibleContent.scaleX and yourVisibleContent.scaleY
}
1 голос
/ 29 марта 2011

Это код, который я использовал для извлечения измерений во время загрузки SWF и их последующего масштабирования растровых изображений, основываясь на ответе Бьорнсона выше.

var actualScale :Number;
var actualStageWidth :Number;
var actualStageHeight :Number;

private function collectDimensions () :void
{
    stage.scaleMode = StageScaleMode.NO_SCALE;
    actualStageWidth = stage.stageWidth;
    actualStageHeight = stage.stageHeight;
    var contentWidth :Number = yourVisibleContent.width;
    var contentHeight :Number = yourVisibleContent.height;
    var canvasAspectRatio :Number = actualStageWidth / actualStageHeight;
    var contentAspectRatio :Number = contentWidth / contentHeight;
    if (canvasAspectRatio > contentAspectRatio) {
        actualScale = actualStageHeight / contentHeight;
    } else {
        actualScale = actualStageWidth / contentWidth;
    }
    stage.scaleMode = StageScaleMode.SHOW_ALL;
}

public function createBitmap (clip :MovieClip) :Bitmap
{
    var bitmapData :BitmapData = new BitmapData(clip.width, clip.height);
    var matrix :Matrix = new Matrix();
    matrix.scale(actualScale, actualScale);
    bitmapData.draw(clip, matrix);
    var bitmap :Bitmap = new Bitmap(bitmapData);
    bitmap.scaleX = bitmap.scaleY = 1/actualScale;
    bitmap.smoothing = true;
    return bitmap;
}
...