Форум 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.width1632
stage.stageWidth500
stage.height902.95
stage.stageHeight375

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

Ниже представлены 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.


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

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