Cоздание резиновых (эластичных) флэш роликов

Общий механизм Главное — сделать так, чтобы набор действий по позиционированию объектов выполнялся при каждом изменении габаритов окна. За информацию о размерах и настройках сцены ролика отвечает встроенный класс Stage. Этот класс обладает несколькими статическими свойствами, которые нам понадобятся: Stage.width — ширина окна ролика в хтмл странице или в флэш плеере. Stage.height — высота окна […]

автор Катерина Павлюкова

Общий механизм

Главное — сделать так, чтобы набор действий по позиционированию объектов выполнялся при каждом изменении габаритов окна.

За информацию о размерах и настройках сцены ролика отвечает встроенный класс Stage. Этот класс обладает несколькими статическими свойствами, которые нам понадобятся:

  • Stage.width — ширина окна ролика в хтмл странице или в флэш плеере.
  • Stage.height — высота окна ролика в хтмл странице или в флэш плеере.
  • Stage.scaleMode — режим масштабирования сцены. Возможные значения этого свойства и подробное описание их действия есть в статье хэлпа к Flash 8. Скажу только, что нам понадобится режим Stage.scaleMode = "noScale", при котором флэш не будет пытаться масштабировать содержимое ролика под габариты окна.
  • Stage.align — выравнивание cодержимого ролика в окне плеера или броузера. Свойство указывает выравнивание по вертикали и горизонтали. В примерах к этому материалу я буду использовать выравнивание по верхнему левому углу окна, от есть Stage.align = "TL"(T — top, L — left). Мне кажется, это удобнее всего. Но, в принципе, вы можете использовать любой другой удобный вам вид выравнивания, это не существенно.

Класс Stage передает сообщения о событии "onResize" при изменении размеров окна плеера или броузера.

Подробнее о механизме передачи событий и о том, что это вообще такое, можно почитать на сайте Роста в статье "Модель событий Flash MX".

Сейчас нам важно понимать только одно: при изменении габаритов окна автоматически сработает метод onResize во всех специально подготовленных к этому объектах. Чтобы подготовить какой-то объект к реагированию на изменения габаритов окна, нужно выполнить два действия:

  • Создать в объекте метод onResize.
  • Связать этот объект с классом Stage.

Внимание! Механизм события onResize будет работать только при включенном режиме Stage.scaleMode = "noScale".

Первое можно сделать так:

// создадим объект
объект_реагирующий = {};

// создадим метод onResize
объект_реагирующий.onResize = function () {

/* какие-то действия по масштабированию или позиционированию клипов на сцене в соответствии с текущими значениями Stage.width и Stage.height */

}

Теперь необходимо сообщить классу Stage, что наш объект_реагирующий должен получать извещения об изменениях габаритов окна. Это делается так:

Stage.addListener(объект_реагирующий);

Переводя эту строку скрипта буквально: "добавить объект_реагирующий в ряды слушателей класса Stage". Стоит отметить, что "слушатель" — это, в данном случае, термин. Слушателями принято называть объекты, которые подписаны на получение извещений о каких-то событиях.

Итак, рецепт подготовки объекта к реагированию на изменения габаритов окна:

Stage.scaleMode = "noScale";

// создадим объект
объект_реагирующий = {};
// создадим метод onResize
объект_реагирующий.onResize = function () {

/* какие-то действия по масштабированию или позиционированию клипов на сцене в соответствии с текущими значениями Stage.width и Stage.height */

}
// наладим связь между классом Stage и нашим объектом Stage.addListener(объект_реагирующий);

В принципе, не обязательно создавать новый объект для помещения в него метода onResize. Вы так же можете использовать для это любой из существующих объектов любого типа, например _root:

Stage.scaleMode = "noScale";

_root.onResize = function () {

// какие-то действия

}
Stage.addListener(_root);

Это удобнее и логичнее, если действий всего одно-два.

Пример:

// код в кадре главной линейки кадров (_root)

// настройки сцены
Stage.scaleMode = "noScale";
Stage.align = "TL";

/* создадим текстовое поле, которое будет содержать подпись и располагаться в правом нижнем углу видимой области ролика */
this.createTextField("TF", 0, 0, 0, 0, 0);
TF.autoSize = true;
TF.text = "подпись в правом нижнем углу";

// метод onResize создается прямо в _root
onResize = function ()
{

/* при каждом изменении габаритов окна ставим текстовое поле на свое место */
this.TF._x = Stage.widththis.TF.textWidth;
this.TF._y = Stage.heightthis.TF.textHeight;

};
Stage.addListener(this);

Результат 1: [посмотреть].

Попробуйте изменить размер окна броузера и убедитесь, что подпись всегда остается в правом нижнем углу окна флэша.

Приём, облегчающий жизнь

Часто при разработке ролика с изменяющимися габаритами требуется позиционировать много объектов в зависимости от размеров окна. Причем довольно часто требуется пропорциональное изменение габаритов/позиции клипов. Это можно сделать так, как было показано в примере 1, а можно придумать что-нибудь более интересное. 🙂

Например, создадим на сцене следующие объекты:

Теперь заставим все эти объекты позиционироваться пропорционально размерам окна, считая "нормальным" размером 400х300 (пока что зададим только изменение позиции).

// настройки сцены
Stage.scaleMode = "noScale";
Stage.align = "TL";

// создадим объект для реагирования на изменение габаритов окна
var resize_obj = {};

// запомнили нормальную ширину
resize_obj.normal_width = 400;

// запомнили нормальную высоту
resize_obj.normal_height = 300;

// самое главное: список объектов, которые будем перемещать
resize_obj.position = [square, // квадрат
circle
, // круг
triangle, // треугольник
TF0
, TF1, TF2, TF3 // текст. поля
];

// собственно, реакция на изменения габаритов окна
resize_obj.onResize = function()
{

var clip; for (var i in this.position) {

// перебираем все клипы в списке
clip = this.position[i];

// восстанавливаем пропорции для каждого клипа
clip._x = Stage.width*clip._xRatio;
clip._y = Stage.height*clip._yRatio;

}

};

// связь между классом Stage и объектом resize_obj
Stage.addListener(resize_obj);

/* запоминаем пропорции (отношение координат к нормальной ширине/высоте) */
var clip;
for (var i in resize_obj.position){

// перебираем все клипы в списке
clip = resize_obj.position[i];
// пропорция по горизонтали
clip._xRatio = clip._x/resize_obj.normal_width;
// пропорция по вертикали
clip_yRatio = clip._y/resize_obj.normal_height;

}

Результат 2: [посмотреть].

Попробуйте растягивать и сжимать окно броузера, и посмотрите, как перемещаются при этом объекты. Мы запомнили соотношение координат каждого из объектов с нормальными размерами сцены. При изменении габаритов окна достаточно умножить соответствующие габариты на сохраненные значения пропорций, чтобы получить искомые значения координат.

Теперь добавим изменение размеров. Пусть клип с кругом всегда будет отмасштабирован пропорционально габаритам окна, квадрат пусть будет растянут только по горизонтали а треугольник вытянут только по вертикали. Чтобы добавить изменение размеров, нужно запомнить пропорции высоты и ширины так же, как мы запоминали пропорции для координат. Добавленные части отмечены жирным шрифтом.

// настройки сцены
Stage.scaleMode
= "noScale";
Stage.align = "TL";

// создадим объект для реагирования на изменение габаритов окна
var
resize_obj = {};

// запомнили нормальную ширину
resize_obj.normal_width = 400;

// запомнили нормальную высоту

resize_obj
.normal_height = 300;

// самое главное: список объектов, которые будем перемещать
resize_obj.position = [square, // квадрат
circle, // круг
triangle, // треугольник
TF0
, TF1, TF2, TF3 // текст. поля
]
;

// собственно, реакция на изменения габаритов окна
resize_obj
.onResize = function()
{

var clip;
for (var i in this.position) {

// перебираем все клипы в списке
clip = this.position[i];

// восстанавливаем пропорции координат для каждого клипа
clip._x = Stage.width*clip._xRatio;
clip._y = Stage.height*clip._yRatio;

// если для клипа определена пропорция по ширине
if (clip._widthRatio != undefined) {
clip._width = Stage.width*clip._widthRatio;
}
// если для клипа определена пропорция по высоте
if (clip._heightRatio != undefined) {
clip._height = Stage.height*clip._heightRatio;
}

}

};

// связь между классом Stage и объектом resize_obj
Stage.addListener(resize_obj);

/* запоминаем пропорции координат (отношение координат к нормальной ширине/высоте) */
var clip;
var clip; for (var i in resize_obj.position) {

// перебираем все клипы в списке
clip = resize_obj.position[i];

// пропорция координаты по горизонтали
clip._xRatio = clip._x/resize_obj.normal_width;

// пропорция координаты по вертикали
clip._yRatio = clip._y/resize_obj.normal_height;
}

/* запоминаем пропорции высоты и ширины (отношение габарита к нормальной ширине/высоте) */

circle
._widthRatio = circle._width/resize_obj.normal_width;
circle
._heightRatio = circle._height/resize_obj.normal_height;
square._widthRatio = square._width/resize_obj.normal_width;
triangle._heightRatio = triangle._width/resize_obj.normal_height;

Результат 3: [посмотреть].

Попробуйте изменять размеры окна броузера и посмотрите, как перемещаются и масштабируются объекты. Обратите внимание, что буквы в текстовом поле справа не деформируются при изменении свойства _width поля. Вместо этого текстовое поле перестраивает свои строки в соответствии с заданной шириной.

Последний штрих к нашей чудо-функции onResize: добавим несколько строк для отображения текущего размера сцены флэша.

_root.TF1.text = "текущие габариты ролика: ";
_root.TF1.text += Stage.width+"x";
_root.TF1.text += Stage.height;

Теперь мы всегда будем знать, каков текущий размер сцены флэша в пикселях.

Результат 4: [посмотреть] [исходник]

Ковры, пряжа, фарфор: Неочевидные тренды современной моды Ковры, пряжа, фарфор: Неочевидные тренды современной моды

На Московской неделе моды мы поговорили с молодыми дизайнерами о том, как сделать творчество модным бизнесом, уникальные авторские изделия – доступными широкой публике

автор Катерина Кулагина

Московская Неделя моды дала возможность всем желающим познакомиться с дизайнерами из разных регионов страны. На огромный маркет и шоурум, проходящие на минус первом этаже ЦВЗ “Манеж” все пять дней, можно было пройти по бесплатной регистрации, также и на события образовательной программы.

Открытость недели моды для публики важна, чтобы мода не казалась людям чем-то недоступным из светской хроники, но стала неотъемлемой частью культурного досуга. Как писал в 19 веке первый русский глянец “Столица и Усадьба”:  “Красивая жизнь доступна не всем, но важно хотя бы знать, что она существует”. В 21 веке важно не просто знать, но запросто в ней, в этой красивой жизни, участвовать. 

Мода – это не всегда про искусство, но всегда про красоту. 

Среди участников маркета и шоурума были молодые дизайнеры, которые в своем творчестве соединяют красоту, искусство и функциональность. Они предлагают мастерски сделанные вещи, которые можно носить в повседневной жизни или сделать особенным свой casual стиль.

Анна Логинова, основатель и дизайнер ювелирного бренда ALCHIMIA

– Бренд “Алхимия” возник в 2020 году, когда создание украшений стало моей основной профессиональной деятельностью. Все украшения сделаны вручную из фарфора и декорированы позолотой или платиной. Фарфор – один из самых древних материалов, его особенность в длительном процессе изготовления: каждое изделие проходит три высокотемпературных обжига в специальной печи, самая высокая температура – 1300 градусов. Это кропотливый труд.

Мы стараемся оставаться доступными для покупателей  (цены варьируются от 2000 до 6000 руб, прим.ред), для кого-то это невысокая цена, а для другого надо решиться на покупку. 

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

Мои украшения можно купить через соцсети в ВК и  Телеграм или в шоуруме на Чистых прудах, где у нас корнер в мультибрендовом магазине, ну и доставить можем в любую точку мира.

Лилиана Апроян, основательница и дизайнер бренда Sovushkas Bag (Армения)

– Мы существуем чуть больше года. Изначально я не планировала развивать бренд – я человек творческий, но дизайну нигде не училась, я получила музыкальное образование – окончила Гнесинку и всегда мечтала петь, продолжаю выступать, даже исполнила дуэт с Филиппом Киркоровым. Скоро выйдет шоу “Перепой звезду” на Первом канале и “Фактор BY” (Беларусь) с моим участием.  

Я люблю съемки и мне нравится делать что-то креативное. Свою первую большую сумку из тонкого ковра я сделала именно для съемок – мечтала попасть в зарубежные глянцевые журналы, и про нас написал Elle Болгария, где бренду  Sovushkas Bag посвятили два разворота.

Я всю жизнь провела далеко от родины – в 90-е гг мои родители переехали в Россию, в Саратов, но я всегда очень скучала по Армении, мне не хватало ее тепла, доброты. В своем письме сыну режиссер Сергей Параджанов написал: “Мне нечего тебе сказать – единственное, когда тебе будет плохо, тронь ковер, в нем есть тепло! Это я!”. Эта фраза вдохновила меня исполнить мечту моей бабушки Сатеник Мнацаканян, которая всю жизнь посвятила семье и дому. Про ее талант шить уникальные изделия из старинных ковров знали только близкие. Я пообещала сделать так, чтобы о сумках из ковров узнали как можно больше людей! 

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

Мне до сих пор трудно дается организация бизнес-процессов, производство, логистика– бренд стал популярным, быстрее, чем я была к этому готова. У нас нет оффлайн шоурума, все заказы отправляем доставкой, доставляли даже в Новую Зеландию, Нидерланды, на Камчатку, Дальний Восток. 

Сумки стоят от 25 тыс рублей, самая дорогая модель из целого ковра – 70 тыс рублей, и на нее было много запросов. Потому что это то, что будет только у тебя, в этом есть душа. 

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

Екатерина Дмитриева, основатель и дизайнер бренда вязаной одежды и аксессуаров Pasma

– Я начала вязать в 15 лет, меня научила мама, и я сама пробовала разные техники, но сначала вязание было просто моим хобби. Свой бренд я решила запустить в 20 лет, три года назад.  Тогда в моде были балаклавы и я начала вязать балаклавы – вязала их весь сезон по несколько штук в день, выкладывала в соцсети, получала множество откликов. Так что все началось с частных заказов через соцсети, позже стали создавать одежду и продавать вещи на Озон. Сейчас в основном участвуем в маркетах, вяжем под запрос и принимаем заказы. 

С нами работает несколько мастеров, но основную работу выполняем мы с мамой.  Вдохновляемся фактурной пряжей и под нее подбираем технику – или вяжем крючком джемперы, или спицами вяжем воздушные дырявые  свитера. Пряжу заказываем оптом на специальных сайтах.

У нас очень много связано вещей, мы их можем продавать два года. По запросу вяжем новые вещи и отшиваем коллекции для участия в маркетах. Спрос зависит от сезона, но бренд окупается и позволяет нам зарабатывать.

Юлия Алиева, основатель бренда вязаной одежды Granny’s и социального проекта Granny’s Russia

– Я несколько лет работала на госслужбе, но всегда хотела заниматься социальным предпринимательством, найти дело своей жизни, которое будет меня вдохновлять. Я поняла, что хочу помогать пенсионерам, и в этих размышлениях в 2018 году родилась идея бренда. Сначала это был бренд, нацеленный на прибыль – с нами работают 6 мастериц пожилого возраста из Москвы и Подмосковья. Мне хотелось и им помочь, и сделать прибыльный бренд, который быстро привлек внимание западных СМИ, про нас писала британская The Times, выходили статьи в Гватемале, Гондурасе…Мне стали писать мастерицы со всех уголков России, так появился социальный проект Granny’s Russia, в рамках которого мы помогаем пенсионерам со всей страны продавать свои изделия, сейчас проект насчитывает более 300 участниц. 

Но изначально бренд Granny’s – это отдельная, авторская, премиальная история. Это всегда совместное творчество, наши мастерицы добавляют что-то свое, например, у нас есть мастерица с потрясающим чувством цвета. Для нашего бестселлера – кардигана “Золотце”, она сама подобрала сочетание цветов. Каждый раз мы используем новые техники, в новой коллекции – это вышивка крестом, к которой мы раньше не обращались.

У меня есть большие планы по развитию. 

Елена и Ольга Быстрицкие, основательницы бренда пляжной одежды Empire of Summer и бренда купальников из солнцезащитной ткани Marmelad

– Началось все с того, что моя сестра – дизайнер Елена Быстрицкая не смогла найти себе подходящий купальник и решила сшить его сама. Мы поняли, что эта ниша свободна и дает большой простор для наших идей. Empire of Summer существует уже более 10 лет, наши купальники носят известные личности, про нас многие знают. 

Дочерний бренд “Мармелад” мы создали в  2018 года – стали отшивать туники из UPF-сетки – специальный материал, защищающий от солнца, их было удобно брать с собой на пляж в дополнение к нашим купальникам. Потом перешли непосредственно на купальники из такого материала со специальной пропиткой, которая имеет уровень защиты SPF 50. Они легкие, дышащие и быстро сохнут. Мы делаем ставку на красивые принты. Все принты Елена рисует сама, отшиваем вещи и принтуем ткани в Москве, а материалы закупаем в основном в Корее и в Дубае. 

У нас есть и мужские модели, и детские коллекции, а также – буркини – закрытые женские купальные костюмы, которые приняты в мусульманских странах, на них большой спрос. 

Изделия Empire of Summer и Marmelad можно купить в нашем магазине в Москве,  в районе метро Пролетарская,и, конечно, мы принимаем заказы онлайн. Да, бренд прибыльный, но почти всю прибыль мы вкладываем в развитие, хочется воплощать новые идеи. 

Текст: Полина Виноградова

Катерина Кулагина

Шеф-редактор

Фото: NULL