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

Я новичок в AS3, и я делаю какой-то пользовательский проект видеоплеера для AIR.Пока я изучал простые примеры (не StageVideo) о том, как воспроизводить видео, я столкнулся с уникальной ситуацией, когда я получил потрясающее автоматическое масштабирование (растягивание по размеру) для поведения окна из Flash.1002 * Всякий раз, когда я устанавливаю ширину и высоту директивы 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 Ответ

3 голосов
/ 02 апреля 2011

Я думаю, что описываемое вами поведение вызвано параметром 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 (особенно удобно, если вы хотите встроить некоторые двоичные данные).

...