Может кто-нибудь объяснить мне, почему поведение этого кода 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 (особенно удобно, если вы хотите встроить некоторые двоичные данные).