Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.11.2012, 15:20
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 1  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Question stage.stageWidth меньше stage.width при stage.scaleMode = StageScaleMode.SHOW_ALL

Здравствуйте.

Пытаюсь использовать
Код 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. Название: 160x90.gif
Просмотров: 2691

Размер: 1.9 Кб
2. Название: 50x37.gif
Просмотров: 2771

Размер: 1.4 Кб

В 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
+ обрабатывать изменения размера самостоятельно, но хотелось бы добиться этого встроенными средствами.

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

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

Старый 29.11.2012, 16:19
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 2  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Что вообще нужно? Чтоб объект был всегда по ширине флешки?

Старый 29.11.2012, 16:27
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 3  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Да, нужно чтобы окно браузера вмещало ролик полностью и flash масштабировал его при изменении размера окна.

Старый 29.11.2012, 16:36
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 4  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Лучше оставить NO_SCALE и модифицировать ваш DO по событию Event.RESIZE Stag'а. Мало ли какое разрешение будет у пользователя...

Старый 29.11.2012, 16:51
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 5  
Ответить с цитированием
dimensb

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

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

Старый 29.11.2012, 18:01
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 6  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от dimensb Посмотреть сообщение
В случае если не заработает придется так и поступить, спасибо за совет.
Конечно только событие RESIZE слушать, оно для этого и сделано.

Старый 29.11.2012, 18:04
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 7  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Цитата:
Сообщение от Sintesis Посмотреть сообщение
Конечно только событие RESIZE слушать, оно для этого и сделано.
Все верно, но масштабирование flash тоже должно работать из коробки, без дополнительных действий. Я пытался разобраться почему это не так.

Старый 30.11.2012, 00:35
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Sintesis Посмотреть сообщение
Конечно только событие RESIZE слушать, оно для этого и сделано.
Немного неверно. В режимах отличных от StageScaleMode.NO_SCALE это событие не диспатчится.

Добавлено через 7 минут
Цитата:
Сообщение от dimensb Посмотреть сообщение
Если я правильно понимаю значения stage.stageWidth и stage.stageHeight, то они должны соответствовать максимальному размеру дочерних объектов.
Stage#stageWidth отражает размер окна flash player или одного из окон air.
А вот DisplayObject#width, который наследует Stage, соответствует вашему предположению.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 29.11.2012, 20:16
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 9  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Потому что SHOW_ALL, будет стремиться показать весь изначальный размер stag'а.
Т.е. если браузер к примеру находится в оконном режиме и окно как-нибудь сжато, или у пользователя установлено разрешение которое вы не учли, то по краям вы увидети область, которая должна была бы находиться за пределами видимости, т.к. stage.stageWidth превышает stage.width.

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


Последний раз редактировалось FlashRus; 29.11.2012 в 20:58.
Старый 30.11.2012, 04:18
dimensb вне форума Посмотреть профиль Отправить личное сообщение для dimensb Найти все сообщения от dimensb
  № 10  
Ответить с цитированием
dimensb

Регистрация: Jun 2012
Сообщений: 16
Цитата:
Сообщение от FlashRus Посмотреть сообщение
Потому что 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 Посмотреть сообщение
С чего бы это?
Поскольку StageScaleMode по умолчанию установлен в SHOW_ALL, а значит содержимое должно масштабироваться в пределах stage. А вот с тем, как определяются эти пределы, я ошибся.

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

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

Спасибо!

Добавлено через 27 минут
Цитата:
Сообщение от dimarik Посмотреть сообщение
Немного неверно. В режимах отличных от StageScaleMode.NO_SCALE это событие не диспатчится.

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


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

Добавлено через 46 минут
Цитата:
Сообщение от AlexeiSulga Посмотреть сообщение
У меня было несколько похожая задача. Есть флешка с фиксированной шириной, высоту влешки меняет 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 файле (если он необходим).

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
stage scaling , Stage.scaleMode , масштабирование , размер окна

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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