PDA

Просмотр полной версии : Намекните как сделать "умный" ресайз мувика ?


rukez
25.07.2005, 13:31
Есть мувик с рамкой из lineTo (т.е. нарисованной) и с содержанием в виде пары textField и jpeg'a. Вопросов два :
1) Как ресайзнуть мувик чтобы не уплыла рамка ? (если делать просто через ._width то ширина меняется правильно, НО! вместе с ней меняется и отлщина линий - причём пропорционально - если начальный размер был 50 и задаём ._width=250 то толщина рамки из исходных 2 становится (250/50)*2=10
Предположим что рамка прямоугольная (то что наклонные линии уплывут это понятно - но там впринципе понятно как бороться)
2) Как при ресайзе перерисовать содержимое мувика ? т.е. есть какой-нить аналог stage.onResize для отдельно взятых мувиков ? .watch как я понял не работает с _width/_height Если аналог есть, то впринципе понятно - задаём координаты всех вложенных в мувик объектов через дельту по осям например - но как словить момент ресайза ?
---
Пока приходит на ум только то, что ресайз мувика есть всегда результат какого-то действия - например в моём случае ресайз привязан к четырём клавишам -> вообще отрисовку можно и на эти клавишы тоже посадить - но может как-то покрасивше можно сделать ?

iNils
25.07.2005, 14:04
1.Если изменения размеров ты делаешь сам (с помощью клавиш), то лучше сразу запускать функцию перерисовки.
2.Можно через onEnterFrame или setInterval проверять размеры текущие с записанными и при не совпадении перерисовывать. Но такой способ ресурсоемкий. Ты можешь ни разу не изменить размер, но проверка будет постоянно осуществляться. Так что, все же лучше первый вариант.

rukez
25.07.2005, 14:23
да, впринципе с перерисовкой я так примерно и описал внизу, а как делать ресайз человеческий ?

iNils
25.07.2005, 14:31
я так и делаю.

rukez
25.07.2005, 14:39
Не, всмысле как ресайзнуть нарисованную рамку не перерисовывая её ? Или тоже только перерисовывать ? С содержимым да - всё просто т.к. меняем только атрибуты, которые не требуют удалять и перерисовывать исходник - а вот при изменении _width нарисованной shape имеет место глюк - как с ним то бороться ? или тоже труба и всётаки перерисовывать ?

iNils
25.07.2005, 14:51
только перерисовывать.

JudgeFog
25.07.2005, 23:09
ленивая стала молодежь
а вот во времена пятерки lineTo не было
что мешает рамку разбить на две горизонтальные линии + две вертикальные
работаешь с ними как с отдельными клипами да и все
горизонтальным _width менять, вертикальные при этом двигать
вертикальным соответственно _height менять и горизонтальные двигать

TERRORist
26.07.2005, 01:36
чтобы сделать умный ресайз нужен как минимум умный флэшер. опционально еще несколько Wmz надо.

john
26.07.2005, 10:00
2rukez

если игнорировать вопрос по толщине рамок,
то ответ на вопрос - использовать layout менеджер.

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

тут есть несколько подходов.

например, стиль html-таблицы - это есть например в swing/java или же во flex.

другой вариант, регистрация поведения каждого отдельного компоннента на изменния высоты/ширины - некий конфигурационный язык описания поведения.

ну и другие подходы.

у меня есть свой собсвенный фреймворк для этого, но в нете есть множество готовых решений.

iNils
26.07.2005, 12:36
можно использовать два мувиклипа. один имеет цвет рамки, другой цвет фона. второй имеет ширину и длину меньше первого на толщину рамки * 2

rukez
26.07.2005, 15:17
Кто там про "умных флэшеров" вспоминал ?
Я именно для разбиения мувика и спрашивал про ширину - а теперь проведи интереса ради эксперимент - сделай мувик высотой в 1px и шириной например в 15, в нём следовательно линию толщиной в 1px и шириной в те-же 15. Всё вроде нормально ... до тех пор пока ты не сделаешь _width=например 45 - линия станет толщиной в 3 пикселя :( -> метод с разбиением мувика на боковые части которые только меняют координаты и среднюю часть которая и меняет свой _width не работает :(
Как вариант можно среднюю часть делать из чёрного jpeg'a размером 1х1 с _width = 15 но блин, где культура языка ? :) Просто если рисовать jpeg'ами растянутыми то придётся отдельно рисовать и область для заливки (тут проблем с окантовкой нет - можно использовать _alpha=0) и ресайзить её вместе со всем клипом. Вообщем как я понял культуры во флэше нету ? :)

iNils
26.07.2005, 16:05
Сделано полностью программно (без проверки на минимальные размеры):
_root.cx = 5;
_root.createEmptyMovieClip ("mc", 1);
_root.mc.createEmptyMovieClip ("mcBG", 2);
_root.mc.createEmptyMovieClip ("mcRamka", 1);
_root.mc.createTextField ("txtContent", 3, _root.cx, _root.cx, 200 - _root.cx * 2, 200 - _root.cx * 2);
_root.mc.txtContent.wordWrap = true;
for (i = 0; i < 100; i++) {
_root.mc.txtContent.text += "test ";
}
_root.mc.mcBG.lineStyle (0, 0xeeeeee);
_root.mc.mcBG.beginFill (0xeeeeee);
_root.mc.mcBG.moveTo (0, 0);
_root.mc.mcBG.lineTo (200 - _root.cx * 2, 0);
_root.mc.mcBG.lineTo (200 - _root.cx * 2, 200 - _root.cx * 2);
_root.mc.mcBG.lineTo (0, 200 - _root.cx * 2);
_root.mc.mcBG.lineTo (0, 0);
_root.mc.mcBG.endFill ();
_root.mc.mcBg._x = _root.cx;
_root.mc.mcBg._y = _root.cx;
_root.mc.mcRamka.lineStyle (0, 0xaaaaaa);
_root.mc.mcRamka.beginFill (0xaaaaaa);
_root.mc.mcRamka.moveTo (0, 0);
_root.mc.mcRamka.lineTo (200, 0);
_root.mc.mcRamka.lineTo (200, 200);
_root.mc.mcRamka.lineTo (0, 200);
_root.mc.mcRamka.lineTo (0, 0);
_root.mc.mcRamka.endFill ();
_root.mc.mcRamka.onPress = function () {
_root.mc.x = _root._xmouse;
_root.mc.y = _root._ymouse;
if (_root.mc.mcRamka._xmouse >= _root.mc.mcRamka._x + _root.mc.mcRamka._width - _root.cx) {
_root.mc.w = 2;
} else if (_root.mc.mcRamka._xmouse <= _root.mc.mcRamka._x + _root.cx) {
_root.mc.w = 1;
}
if (_root.mc.mcRamka._ymouse > _root.mc.mcRamka._height / 2) {
_root.mc.h = 2;
} else {
_root.mc.h = 1;
}
_root.mc.mcRamka.onMouseMove = _root.mc.mcRamka.move;
};
_root.mc.mcRamka.onRelease = _root.mc.mcRamka.onReleaseOutside = function () {
_root.mc.w = 0;
_root.mc.h = 0;
delete _root.mc.mcRamka.onMouseMove;
};
_root.mc.mcRamka.move = function () {
if (_root.mc.w == 2) {
_root.mc.mcRamka._width += _root._xmouse - _root.mc.x;
_root.mc.x = _root._xmouse;
_root.mc.mcBG._width = _root.mc.txtContent._width = _root.mc.mcRamka._width - _root.cx * 2;
} else if (_root.mc.w == 1) {
var dx = _root._xmouse - _root.mc.x;
_root.mc.mcRamka._x += dx;
_root.mc.mcRamka._width -= dx;
_root.mc.x = _root._xmouse;
_root.mc.mcBG._x = _root.mc.txtContent._x = _root.mc.mcRamka._x + _root.cx;
_root.mc.mcBG._width = _root.mc.txtContent._width = _root.mc.mcRamka._width - _root.cx * 2;
}
if (_root.mc.h == 2) {
_root.mc.mcRamka._height += _root._ymouse - _root.mc.y;
_root.mc.y = _root._ymouse;
_root.mc.mcBG._height = _root.mc.txtContent._height= _root.mc.mcRamka._height - _root.cx * 2;
} else if (_root.mc.h == 1) {
var dy = _root._xmouse - _root.mc.x;
_root.mc.mcRamka._y += dy;
_root.mc.mcRamka._height -= dy;
_root.mc.y = _root._ymouse;
_root.mc.mcBG._y = _root.mc.txtContent._y= _root.mc.mcRamka._y + _root.cx;
_root.mc.mcBG._height = _root.mc.txtContent._height =_root.mc.mcRamka._height - _root.cx * 2;
}
};

MaxLife
26.07.2005, 18:44
Проблема с линиями может быть исправлена тем, что линии ставится hairline-стиль. Однако для действительно больших масштабов - 10000%, 100000% могут появиться ещё более неприятные косяки в виде следов от перерисовки.

Лечить вообще с помощью вложенных клипов можно. Для этого рекомендауется рамочный клип делать сразу приличной высоты или ширины, а потом его сжимать до 10-1%. В этом случае можно жить.

А сам вопрос на тему ресайзинга Макромедия решает через UIComponent - там есть метод draw(), используемый для перерисовки при изменении размеров, однако в этом случае нужно использовать не _width/_height, а setSize(). Если сочетать его с техникой рамочных клипов, надо перехватывать либо сам setSize, либо draw, либо, кажется, layoutChildren() или что-то вроде. Можно глянуть в исходник UIComponent'а. От себя скажу, что я перехватывал и сам setSize, и служебный метод, и работало. Давно, правда, было. Где исходник не упомню...

MaxLife
26.07.2005, 19:36
Наврал. Нашёл у себя - size() перехватывать надо :)