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: [посмотреть] [исходник]

День банана: чем полезен этот плод для кожи и волос?

10 апреля во всем мире отмечают День банана - фрукта, который хорош не только для перекуса, но и для бьюти-процедур. Рассказываем, как банан преображает кожу и волосы, и делимся рецептами.

автор Мария Орешкина

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

  • Банан – источник витаминов А, С, Е и группы В. Витамины А и С – знаменитые антиоксиданты, которые борются со свободными радикалами – главными врагами молодости кожи. Витамин Е питает и ускоряет регенерацию, а витамины группы В успокаивают воспаления и улучшают цвет лица.
  • Банан богат калием – ключевым минералом для удержания влаги в клетках. Он помогает сухой и обезвоженной коже восстанавливать гидробаланс, делая ее более упругой и сияющей.
Фото: freepik.com
freepik.com
  • В банане содержится фруктоза и натуральные полисахариды, которые работают как мягкие увлажнители. Они создают на поверхности кожи и волос тонкую дышащую пленку, которая удерживает влагу, но не забивает поры.
  • В кожуре банана (да-да, той самой, которую мы привыкли выбрасывать!) содержатся аминокислоты и лютеин – мощные антиоксиданты и противовоспалительные агенты, которые помогают успокоить раздраженную кожу и борются с отечностью.

Банан в косметике

В косметике обычно используется экстракт банана или масло банановых семян. Банановое масло – легкое, быстро впитывающееся, богатое калием и витаминами. Его добавляют в увлажняющие эмульсии и маски. Экстракт банана благодаря содержанию фруктовых кислот обеспечивает мягкое отшелушивание, выравнивает тон и стимулирует обновление клеток. Кроме того, банановая косметика славится своей гипоаллергенностью и подходит даже для чувствительной кожи.

Фото: архивы пресс-служб. Витаминная маска для лица BANANА BOWL, Miss Organic; Крем-сыворотка для рук с экстрактом банана Banana Hand Essence, CONSLY; Очищающая питающая пенка для лица с медом и бананом Honey Banana Cleansing Foam, SCINIC; Тканевая маска с Бананом Loverecipe, Sally's Box; Питательная маска 3в1 для волос Банан, Garnier Fructis
Фото: архивы пресс-служб. Витаминная маска для лица BANANА BOWL, Miss Organic; Крем-сыворотка для рук с экстрактом банана Banana Hand Essence, CONSLY; Очищающая питающая пенка для лица с медом и бананом Honey Banana Cleansing Foam, SCINIC; Тканевая маска с Бананом Loverecipe, Sally’s Box; Питательная маска 3в1 для волос Банан, Garnier Fructis

Бьюти-лаборатория на кухне: 3 рецепта с бананом

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

 Питательная маска для сухой и уставшей кожи 

Что понадобитсяПоловина спелого банана, 1 ч. л. оливкового масла, 1 ч. л. жирных сливок или натурального йогурта.
Как приготовитьРазомните банан вилкой, смешайте с маслом и сливками до однородной консистенции. Для удобства можно использовать погружной блендер.
Как использоватьНанесите на очищенное лицо и оставьте на 20 минут. Смойте прохладной водой. Маска интенсивно питает, убирает чувство стянутости и дарит коже ощущение комфорта. Идеальна после ветренного дня и агрессивных бьюти-процедур.
Фото: freepik.com
freepik.com

SOS-маска для блеска и мягкости волос

Что понадобится1 спелый банан, 2 ст. л. базового масла (репейного, авокадо или кокосового), 1 ч. л. натурального меда.
Как приготовитьИзмельчите банан в блендере до состояния однородного пюре без комочков, добавьте масло и мед, снова перемешайте.
Как использоватьНанесите маску на влажные волосы, отступив от корней 2–3 см, особенно тщательно обработайте кончики. Укутайте голову полотенцем (создаем эффект сауны!) и оставьте на 40 минут. Тщательно смойте с шампунем. Волосы станут мягкими, блестящими и более послушными.

Мягкий скраб-маска для тела

Что понадобитсяПоловина спелого банана, 1 ст. л. коричневого сахара, 1 ч. л. масла жожоба или миндаля.
Как приготовитьСмешайте все ингредиенты до получения однородной пасты.
Как использоватьПосле горящего душа комфортной температуры помассируйте кожу тела в течение нескольких минут. Оставьте смесь еще на 5 минут как питательную маску, затем смойте теплой водой. Скраб деликатно отшелушивает, улучшает тон кожи, борется с сухостью кожи на локтях и коленях, разгоняет лимфу и уменьшает отеки. Подходит для любого типа кожи, за исключением очень чувствительной и склонной к атопии.
Фото: freepik.com
freepik.com

Мария Орешкина

Редактор раздела «Бьюти»