![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2009
Сообщений: 9
|
Доброе время суток. Есть проблема с которой не могу справиться. Есть флешка в которой много векторных элементов. Надо плавно маштабировать эту флешку. Сейчас это реализовано так
function zoom_func() { if (_root.pan_mc.pan_mc._y<-1) { _root.logo_mc._xscale = _root.logo_mc._yscale=100+200/50*Math.round(Math.abs(_root.pan_mc.pan_mc._y))+Number(_root.varScale); } else if (_root.pan_mc.pan_mc._y>1) { _root.logo_mc._xscale = _root.logo_mc._yscale=100-50/50*Math.round(Math.abs(_root.pan_mc.pan_mc._y))+Number(_root.varScale); } else { _root.logo_mc._xscale = _root.logo_mc._yscale=100+Number(_root.varScale); } _root.zoom_txt.text = _root.logo_mc._xscale-Number(_root.varScale)+"%"; _root.onMouseMove(); } this.onMouseWheel = function(varDelta:Number) { _root.pan_mc.pan_mc._y -= varDelta/4; if (_root.pan_mc.pan_mc._y<-50) { _root.pan_mc.pan_mc._y = -50; } else if (_root.pan_mc.pan_mc._y>50) { _root.pan_mc.pan_mc._y = 50; } _root.zoom_func(); }; |
|
|||||
|
Модрон-ветеринар
|
Решаемо. Была проблема с масштабированием мувика со сложным контентом.
Я сделал так: 0) Начало масштабирования. Получаем данные о пропорциях масштабирования (во сколько раз изменяем, ратио). 1) С целевого мувика, забитого векторной графикой, снимается битмапа-слепок (draw (BitmapData.draw method)). 2) Целевой мувик делается невидимым. (_visible = false) 3) Создается пустой мувик, в тех же координатах, что и масштабированный (нужно будет точно спозиционировать). 4) К нему приаттачивается полученная битмапа (attachBitmap (MovieClip.attachBitmap method)). - глазу подмена практически незаметна - имеем вместо нашего вектрообильного мувика простой мувик с битмапной картинкой внутри 5) Масштабируем копию с битмапой - все происходит плавно и без рывков. 6) В это время (тут же) скрытый мувик масштабируется в той же пропорции, используем известное ратио. 7) Конец масштабирования. Удаляем битмапную копию (removeMovkeClip) и проявляем оригинал (_visible = true). Оригинал проявляется на том же месте и так же растянутый / сжатый, что глазу подмена опять незаметна. В случае, если у вас целевой мувик не содержит объектов, с которыми в дальнейшем нужно производить какие-то действия, можно так и оставить битмапную копию, а оригинал вообще удалить (removeMovieClip). Если у вас данные о пропорциях масштабирования вводятся с колесика, то рационально будет оставить и масштабировать битмапную копию до того момента, пока юзер не перестанет колесико крутить плюс несколько сотен миллисекунд, полсекунды например. Подобрать экспериментально придется. Либо, что лучше всего, как уже сказал, вообще забыть про оригинал, и держать на сцене битмапную копию, если это у вас логотип или что-то чисто графическое масштабируется. В инете, да и тут, наверное, есть готовые написанные функции для процедуры п.п. 1-4. Поищите, если хотите примерно по ключевым словам "растеризация мувика, мувиклипа", Последний раз редактировалось mooncar; 28.01.2010 в 01:45. |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 9
|
Спасибо. Попытался сделать, но уперся в одну трудность. Добавил вот этот код
var logoBitmap:BitmapData = new BitmapData(_root.logo_mc._width,_root.logo_mc._height, true, 0xff000000); logoBitmap.draw(_root.logo_mc); this.createEmptyMovieClip("logo_temp", this.getNextHighestDepth()); _root.logo_temp._x=_root.logo_mc._x; _root.logo_temp._y=_root.logo_mc._y; logo_temp.attachBitmap(logoBitmap, 2, "auto", true); _root.logo_mc._visible = false; |
|
|||||
|
Модрон-ветеринар
|
Спозиционируйте контент logo_mc так, чтобы точка регистрации приходилось на левый верхний угол.
Если контент слишком громоздок для группового перемещения (трудно все перенести), то заключите logo_mc в мувик-контейнер, зайдите в него и спозиционируйте уже logo_mc опять-таки так, чтобы содержание было справа и внизу, чтобы нулевая точка приходилась на левый верхний угол. Тогда растеризовать будете уже этот мувик-контейнер. Видимо, когда строится битмапа, ее парсер начинает с точки 0,0 мувика. Мувики, созданные в авторской среде (т.е. нарисованные), обычно имеют контент, распространяющийся внутри него от нулевой точки во все стороны. То есть обычно точка регистрации авторских мувиков стоит в центре, и центр содержимого совпадает с центром мувика. Тогда как если мы создаем пустой мувик программно и грузим картинку извне, например, или что-то рисуем в нем программно, контент сориентирован в мувике-контейнере справа и вниз от нулевой точки. И тогда парсер битмапопостроения работает правильно с точки зрения полного захвата содержимого. Вот, кстати, функция, я нашел у себя: import flash.display.BitmapData; function rasterizeMovieClip (obj:MovieClip):MovieClip { var bd_mc:MovieClip = this.createEmptyMovieClip (obj._name + '_bd', this.getNextHighestDepth()); var bd:BitmapData = new BitmapData(obj._width, obj._height, true, null); bd.draw(obj); bd_mc.attachBitmap (bd, bd_mc.getNextHighestDepth()); bd_mc.forceSmoothing = true ; //можно сгладить тут, а можно и при аттаче bd_mc._x = obj._x ; bd_mc._y = obj._y ; obj._visible = false ; return bd_mc; } rasterizeMovieClip (logo_mc); Добавлено через 17 минут Будет один будет нюанс - при изменениии _xscale и _yscale расширение копии пойдет вправо и вниз, а не во все стороны, так как контент сориентирован теперь относительно нулевой точки внизу и справа. То есть в процессе масштабирования для компенсации этого нужно будет еще смещать координаты копии, если хотите, чтобы центр масштабирования приходился именно на центр контента. В общем-то ничего сложного, голая арифметика. Я делал именно так. Последний раз редактировалось mooncar; 28.01.2010 в 04:42. |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 9
|
Большое спасибо, все получилось
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:06. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| маштабирование , Плавное увеличение |
|
|