Может кто-нибудь объяснить мне, почему поведение этого кода ActionScript является автоматическим масштабированием?

Я новичок в AS3, и я делаю некоторый пользовательский проект видео плеер для AIR. Пока я изучал простые примеры (не StageVideo) о том, как воспроизводить видео, я столкнулся с уникальной ситуацией, когда я получил потрясающее автоматическое масштабирование (растягивание до соответствия) поведению окон из Flash.

Всякий раз, когда я устанавливаю ширину и высоту директивы SWF, равную ширине и высоте создаваемого мной объекта flash.media.Video. Он выполняет автоматическое масштабирование, растягивание по размеру и изменение размеров. Вот так:

// SWF directive placed before the class declaration of the main class
[SWF( width="1024", height="576", backgroundColor="000000", visible="true" )]

// somewhere in my initialization
myvid = new Video();
with( myvid )
{
    x = 0;
    y = 0;
    width = 1024; // if I set this wxh equal to wxh in the SWF directive it auto-scales!
    height = 576;
}
myvid.attachNetStream( myns );
addChild( myvid ); // must come after instancing of video and netstream, and attach to make the auto-scale work
myvid.play( "somevideo.flv" );

Даже если я установлю ширину 16 и высоту 9 на обоих, она масштабируется и идеально вписывается в размер моего окна. Могут ли некоторые объяснить мне это поведение? Ничто из того, что я прочитал в документации, не упоминало об этом.

Не поймите меня неправильно, мне нравится это поведение!:) Это сделало вещи проще для меня. Но с точки зрения кода мне нужно понять, почему это происходит, так как код, который я установил, не имеет ничего общего с автоматическим масштабированием.

Кроме того, какого черта директивы для? Разве они не имеют чистый эквивалент ActionScript 3? Они выглядят хакерскими для меня.

1 ответ

Решение

Я думаю, что поведение, которое вы описываете, вызвано scale параметр в HTML-кодирование Flash. Обычно это по умолчанию showAll масштабирование Flash вверх, чтобы соответствовать контейнеру.

Существуют два разных размера: размер контейнера (блока на странице HTML) и размер содержимого Flash (который указан в теге SWF). Режим масштабирования определяет поведение, когда эти размеры не совпадают. Вы можете управлять этим поведением либо путем настройки этого параметра, либо из AS3 напрямую, используя stage.scaleMode:

import flash.display.StageScaleMode;
// scale the content to fit the container, maintaing aspect ratio
stage.scaleMode = StageScaleMode.SHOW_ALL;
// disable scaling
stage.scaleMode = StageScaleMode.NO_SCALE;

Если вы хотите использовать режим масштабирования в ваших интересах, я бы установил ширину вашего видео в соответствии с размерами сцены следующим образом:

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

Таким образом, вам не придется повторять ширину и высоту SWF.

Директивы в основном определяют некоторые метаданные или инструкции для компилятора. В частности, тег SWF определяет информацию в заголовке SWF, такую ​​как требуемая ширина, высота, частота кадров. В основном это всего лишь несколько советов игроку + контейнеру о том, как файл должен отображаться. Некоторые из них могут быть изменены в коде (stage.frameRate = 50;). Еще один метатег Embed, который объединит некоторые активы в SWF (особенно удобно, если вы хотите встроить некоторые двоичные данные).

Другие вопросы по тегам