Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   stage.stageWidth меньше stage.width при stage.scaleMode = StageScaleMode.SHOW_ALL (http://www.flasher.ru/forum/showthread.php?t=188161)

dimensb 29.11.2012 15:20

stage.stageWidth меньше stage.width при stage.scaleMode = StageScaleMode.SHOW_ALL
 
Вложений: 2
Здравствуйте.

Пытаюсь использовать
Код AS3:

stage.scaleMode = StageScaleMode.SHOW_ALL

для масштабирования приложения, но вижу лишь увеличенную часть изображения.

--

Процесс загрузки приложения происходит следующим образом:
1. Загружается preloader
2. Preloader загружает основной код
3. Который, в свою очередь, загружает ресурсы в виде изображений, дополнительных swf и отрисовывает главное окно приложения.

Максимальный размер ресурса, который загружается на 3-м этапе - 1600х900, при масштабировании просто хотел положиться на stage.scaleMode = StageScaleMode.SHOW_ALL, однако, в процессе загрузки, вижу что

Код AS3:

stage.width =  1632
stage.stageWidth =  500
stage.height =  902.95
stage.stageHeight =  375

и на весь экран отображается лишь часть изображения.

Ниже представлены 2 изображения, не из приложения, просто чтобы дать представление о том, как это выглядит:
1. Вложение 28745
2. Вложение 28747

В html и js файлах, используемых для загрузки, width = height = 100%.
Пробовал загрузку в разных браузерах, результат одинаков.

Судя по всему размер 500x375 является размером по умолчанию, которую использует mxmlc (http://livedocs.adobe.com/flex/3/htm...pilers_13.html, опция default-size)

Если я правильно понимаю значения stage.stageWidth и stage.stageHeight, то они должны соответствовать максимальному размеру дочерних объектов. Такое поведение можно наглядно наблюдать в примере http://theactionscripter.com/2009/05...tagewidth.aspx (можно открыть его в отдельном окне, тогда будет видно что stageWidth совпадает с размером экрана http://theactionscripter.com/files/3...stagewidth.swf)

Если установить тэг компилятора
Код AS3:

[SWF(width="1600", height="900")]

, то окно отрисовывается верного размера, но, при этом, не масштабируется, а ведет себя как при NO_SCALE.

Понимаю, что можно использовать совместное решение установки тэга и установки
Код AS3:

stage.scaleMode = StageScaleMode.NO_SCALE

+ обрабатывать изменения размера самостоятельно, но хотелось бы добиться этого встроенными средствами.

Возможно кто-то сталкивался с похожей ситуацией и знает решение проблемы.

Заранее спасибо.

Sintesis 29.11.2012 16:19

Что вообще нужно? Чтоб объект был всегда по ширине флешки?

dimensb 29.11.2012 16:27

Да, нужно чтобы окно браузера вмещало ролик полностью и flash масштабировал его при изменении размера окна.

FlashRus 29.11.2012 16:36

Лучше оставить NO_SCALE и модифицировать ваш DO по событию Event.RESIZE Stag'а. Мало ли какое разрешение будет у пользователя...

dimensb 29.11.2012 16:51

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

В случае если не заработает придется так и поступить, спасибо за совет.

Sintesis 29.11.2012 18:01

Цитата:

Сообщение от dimensb (Сообщение 1106876)
В случае если не заработает придется так и поступить, спасибо за совет.

Конечно только событие RESIZE слушать, оно для этого и сделано.

dimensb 29.11.2012 18:04

Цитата:

Сообщение от Sintesis (Сообщение 1106901)
Конечно только событие RESIZE слушать, оно для этого и сделано.

Все верно, но масштабирование flash тоже должно работать из коробки, без дополнительных действий. Я пытался разобраться почему это не так.

FlashRus 29.11.2012 20:16

Вложений: 1
Потому что SHOW_ALL, будет стремиться показать весь изначальный размер stag'а.
Т.е. если браузер к примеру находится в оконном режиме и окно как-нибудь сжато, или у пользователя установлено разрешение которое вы не учли, то по краям вы увидети область, которая должна была бы находиться за пределами видимости, т.к. stage.stageWidth превышает stage.width.

Так, например, будет выглядеть ваш ролик с SHOW_ALL на квадратном мониторе. Красные полосы это дельта stage.height от stage.stageHeight.

caseyryan 29.11.2012 22:26

Цитата:

Все верно, но масштабирование flash тоже должно работать из коробки, без дополнительных действий.
С чего бы это?

AlexeiSulga 29.11.2012 23:52

У меня было несколько похожая задача. Есть флешка с фиксированной шириной, высоту влешки меняет javascript.

HTML, JS
Код AS3:

var fo = new FlashObject("myflash.swf", "myFlash", "919", "2000", "10");
<div style="width:919px; height:754px;" id="flashcontent_widget">
</div>
function resizeFlash(h)
{
$("#myFlash").attr("height", h);
}

Стартовые размеры флешки 919x754. Значение высоты 2000 в данном случае роли не играет.

AS3 Document class
Код AS3:

stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
stage.align = flash.display.StageAlign.TOP_LEFT;
stageResize();
stage.addEventListener(Event.RESIZE, stageResize, false, 0, true);
private function stageResize(event:Event = null):void
{
        this.scaleX = this.scaleY = stage.stageWidth / 919;
}

"stage.stageWidth меньше stage.width". В моем понимании stage.stageWidth это ширина swf в браузере. Она зависит от html, stage.width - это ширина объектов на сцене. Необходимо также учитывать zoom в самом браузере. Если 1 тогда все нормально, если пользователь увеличит zoom тогда stage.stageWidth увеличится, в этом случае флешь дожен изменить scaleX document класса.

Другая серьезная проблема с которой я столкнулся быля связана с тем что при изменении размера swf из JS наблюдалось кратковременное (примерно 0.2 секунды) изменение aspect ratio флешки. Это было заметно и неприемлемо. Протестировал все 4 варианта StageScaleMode: SHOW_ALL, NO_SCALE, NO_BORDER, EXACT_FIT. Нормально работает только NO_SCALE.

dimarik 30.11.2012 00:35

Цитата:

Сообщение от Sintesis (Сообщение 1106901)
Конечно только событие RESIZE слушать, оно для этого и сделано.

Немного неверно. В режимах отличных от StageScaleMode.NO_SCALE это событие не диспатчится.

Добавлено через 7 минут
Цитата:

Сообщение от dimensb (Сообщение 1106863)
Если я правильно понимаю значения stage.stageWidth и stage.stageHeight, то они должны соответствовать максимальному размеру дочерних объектов.

Stage#stageWidth отражает размер окна flash player или одного из окон air.
А вот DisplayObject#width, который наследует Stage, соответствует вашему предположению.

Wolsh 30.11.2012 00:44

Цитата:

Все верно, но масштабирование flash тоже должно работать из коробки, без дополнительных действий. Я пытался разобраться почему это не так.
Насколько я понял Ваше представление этого процесса, если, скажем, в начале после запуска ролика на сцене лежит красный кружок и начинает двигаться вправо, то "из коробки" Вы ожидаете получить постоянное уменьшение изображения таким образом, чтобы кружок никогда не вышел из поля видимости? Бедные, бедные мультипликаторы...
SHOW_ALL означает, что прямоугольник дефолтного размера стейджа всегда будет полностью виден. Что там творится за границей "рабочего стола", никого не волнует. Мультипликаторы обычно держат там всякое зверье, входящее в кадр и выходящее из него, а у игроделов там покусанные края карты. И ни те, ни другие не хотят, чтобы юзер любовался бардаком за сценой.

Добавлено через 3 минуты
Сорри. "Творческим беспорядком")))

dimensb 30.11.2012 04:18

Цитата:

Сообщение от FlashRus (Сообщение 1106924)
Потому что SHOW_ALL, будет стремиться показать весь изначальный размер stag'а.
Т.е. если браузер к примеру находится в оконном режиме и окно как-нибудь сжато, или у пользователя установлено разрешение которое вы не учли, то по краям вы увидети область, которая должна была бы находиться за пределами видимости, т.к. stage.stageWidth превышает stage.width.

Так, например, будет выглядеть ваш ролик с SHOW_ALL на квадратном мониторе. Красные полосы это дельта stage.height от stage.stageHeight.

Согласно http://help.adobe.com/en_US/FlashPla...lay/Stage.html stage представляет собой всю область, где отображается содержимое flash, что сбило меня с толку, поскольку я решил что размер stage просто подстроится под размер отрисованного содержимого.

В вашем примере верно показано, что размер stage - это один параметр, а размеры объектов, которые отрисованы на нем, могут быть больше, поэтому отобразится только часть. Долго экспериментировал с отрисовкой за границей stage, все сошлось :)

Спасибо за разъяснение!

Добавлено через 5 минут
Цитата:

Сообщение от caseyryan (Сообщение 1106933)
С чего бы это?

Поскольку StageScaleMode по умолчанию установлен в SHOW_ALL, а значит содержимое должно масштабироваться в пределах stage. А вот с тем, как определяются эти пределы, я ошибся.

Добавлено через 11 минут
Цитата:

Сообщение от Wolsh (Сообщение 1106949)
Насколько я понял Ваше представление этого процесса, если, скажем, в начале после запуска ролика на сцене лежит красный кружок и начинает двигаться вправо, то "из коробки" Вы ожидаете получить постоянное уменьшение изображения таким образом, чтобы кружок никогда не вышел из поля видимости? Бедные, бедные мультипликаторы...
SHOW_ALL означает, что прямоугольник дефолтного размера стейджа всегда будет полностью виден. Что там творится за границей "рабочего стола", никого не волнует. Мультипликаторы обычно держат там всякое зверье, входящее в кадр и выходящее из него, а у игроделов там покусанные края карты. И ни те, ни другие не хотят, чтобы юзер любовался бардаком за сценой.

Добавлено через 3 минуты
Сорри. "Творческим беспорядком")))

Я отключаю ненужные объекты с помощью visible, поэтому не задумывался о таком случае, но, по сути, вы правы.
Если бы stage включал в себя все объекты, от него было бы не спрятаться ;)

Спасибо!

Добавлено через 27 минут
Цитата:

Сообщение от dimarik (Сообщение 1106947)
Немного неверно. В режимах отличных от StageScaleMode.NO_SCALE это событие не диспатчится.

Добавлено через 7 минут


Stage#stageWidth отражает размер окна flash player или одного из окон air.
А вот DisplayObject#width, который наследует Stage, соответствует вашему предположению.

Еще раз проверил на примере, все верно, спасибо!

Добавлено через 46 минут
Цитата:

Сообщение от AlexeiSulga (Сообщение 1106945)
У меня было несколько похожая задача. Есть флешка с фиксированной шириной, высоту влешки меняет javascript.

HTML, JS
Код AS3:

var fo = new FlashObject("myflash.swf", "myFlash", "919", "2000", "10");
<div style="width:919px; height:754px;" id="flashcontent_widget">
</div>
function resizeFlash(h)
{
$("#myFlash").attr("height", h);
}

Стартовые размеры флешки 919x754. Значение высоты 2000 в данном случае роли не играет.

AS3 Document class
Код AS3:

stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
stage.align = flash.display.StageAlign.TOP_LEFT;
stageResize();
stage.addEventListener(Event.RESIZE, stageResize, false, 0, true);
private function stageResize(event:Event = null):void
{
        this.scaleX = this.scaleY = stage.stageWidth / 919;
}

"stage.stageWidth меньше stage.width". В моем понимании stage.stageWidth это ширина swf в браузере. Она зависит от html, stage.width - это ширина объектов на сцене. Необходимо также учитывать zoom в самом браузере. Если 1 тогда все нормально, если пользователь увеличит zoom тогда stage.stageWidth увеличится, в этом случае флешь дожен изменить scaleX document класса.

Другая серьезная проблема с которой я столкнулся быля связана с тем что при изменении размера swf из JS наблюдалось кратковременное (примерно 0.2 секунды) изменение aspect ratio флешки. Это было заметно и неприемлемо. Протестировал все 4 варианта StageScaleMode: SHOW_ALL, NO_SCALE, NO_BORDER, EXACT_FIT. Нормально работает только NO_SCALE.

В итоге решилось все следующим образом:
Как показали выше, размер stage не привязан к размеру отображаемых объектов.

Что меня удивило, так это то, что без использования тэга [SWF(width='x', height='y')] масштабирование происходит нормально, но в пределах stage (размер которого равен 500х375 в этом случае - судя по всему значение по умолчанию для mxmlc), а при использовании тэга масштабирование не происходило вообще.
Для разработки использовался Flash Builder, который генерирует html файл для вызова swf и оказалось, что html файл содержит указание размеров в px, которые берутся из тэга SWF, если он есть и 100% по ширине и высоте, если его нет.
Загрузив SWF напрямую все заработало.
Насколько понимаю правильным решением будет указание необходимого разрешения в тэге SWF + использование 100% в html файле (если он необходим).

Спасибо всем за помощь!

FlashRus 30.11.2012 08:51

Цитата:

Я отключаю ненужные объекты с помощью visible, поэтому не задумывался о таком случае, но, по сути, вы правы.
Если бы stage включал в себя все объекты, от него было бы не спрятаться
Воспользуйтесь маской.
http://help.adobe.com/ru_RU/FlashPla...ject.html#mask

PainKiller 30.11.2012 15:32

Цитата:

Другая серьезная проблема с которой я столкнулся быля связана с тем что при изменении размера swf из JS наблюдалось кратковременное (примерно 0.2 секунды) изменение aspect ratio флешки. Это было заметно и неприемлемо. Протестировал все 4 варианта StageScaleMode: SHOW_ALL, NO_SCALE, NO_BORDER, EXACT_FIT. Нормально работает только NO_SCALE.
То есть вам при NO_SCALE удалось избавиться от этого эффекта? я просто так тоже делал в одном проекте и флешка бликует и дергается при изменении размера (а размер менялся при переключении стр.), особенно в хроме, избавиться от этого пока так и не удалось. Параметр StageScaleMode - NO_SCALE

AlexeiSulga 01.12.2012 01:17

Цитата:

Сообщение от PainKiller (Сообщение 1107025)
То есть вам при NO_SCALE удалось избавиться от этого эффекта? я просто так тоже делал в одном проекте и флешка бликует и дергается при изменении размера (а размер менялся при переключении стр.), особенно в хроме, избавиться от этого пока так и не удалось. Параметр StageScaleMode - NO_SCALE

Тоже блики и дергания были, но проблема решилась. Код приведен выше.

Код AS1/AS2:

var fo = new FlashObject("myflash.swf", "myFlash", "919", "2000", "10");

Попробуйте не задавать размеры флешки как 100%.

PainKiller 01.12.2012 21:07

Цитата:

Попробуйте не задавать размеры флешки как 100%.
Да у меня флешка задана как 100%, но от этого в проекте уже никак не денешся. А вообще в IE и FF все выглядит более менее приемлимо, вот хром сурово страницы перерисовывает. А вообще обсуждение ценное, учту на будущее :-)


Часовой пояс GMT +4, время: 14:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.