PDA

Просмотр полной версии : будто уменьшает содержимое, оставляя пустые края


ThyQ
09.07.2009, 14:52
Здравствуйте, Уважаемые.
Этот форум для меня теперь настоящий учебник.
Взялся за написание "плагина", если "это" так можно назвать.
все элементы создаются программно. Суть в том, что указанная фотка получает возможность быть более детально рассмотрена (в той части фотки, где находится курсор мыши).
в HTML определяю четко размеры самой свфки, и передаю те же значения в свфку.
В свфке создаю несколько мувиклипов
в один гружу фоту(фон)
во второй гружу ту же фоту но умноженную в размере на множитель zoom (это даёт эффект увеличенности), из другого делаю маску, соответственно накладываю маску, и двигаю маску в соответствии с координатами мыши, смещая увеличенную фоту под маской так, чтобы в области маски показывался тот же участок, на который указывает мышь в неувеличенной фоте.
В общем функциональность присутствует.
Но есть одно "НО", при тестировании, подставляя разные фото я столкнулся с странным поведением свфки. Она будто уменьшает контент, оставляя часть свфки пустой.

pwidth и pheight - переменные передаваемые из HTML
После изнурительного поиска нашел лишь это:


Stage.width=parseInt(pwidth);
Stage.height=parseInt(pheight);


но ошибка не устранилась...

Так я пытался растягивать мувиклип неувеличенной фотки на всю область свфки


var mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
mcl.addListener(listener);
this.createEmptyMovieClip("the_image", 0);
mcl.loadClip(small_pic, the_image);
listener.onLoadInit = function(the_image:MovieClip) {
the_image._width=parseInt(pwidth);
the_image._height=parseInt(pheight);
};


Потом я подумав ещё предположил: "может в zoomе дело???, мол он жеж увеличвает изображение под маской, поэтому может и выделяет под себя "территорию" внутри свфки..."
Организовано это так:


var mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
mcl.addListener(listener);
createEmptyMovieClip("bg_pic", 1);
mcl.loadClip(small_pic, bg_pic);
listener.onLoadInit = function(bg_pic:MovieClip) {
bg_pic._width=pwidth*zoom;
bg_pic._height=pheight*zoom;

bg_pic.setMask(circle_mc);
};


Но при значительном изменении значения zoom "пустая область" осталась неизменной.
Код с готовой работой тоже прилагаю, если некорректно описал, простите...2 дня уже не сплю...((( :wacko:

iNils
09.07.2009, 15:06
Stage.width
Stage.heightЭти свойства read-only, изменить их вы не можете.

dimarik
09.07.2009, 20:00
ThyQ, я не увидел четко сформулированного вопроса.

Из фразы "она будто уменьшает контент, оставляя часть свфки пустой" попытаюсь предположить, что контент не должен уменьшаться, и тем более не оставлять часть свфки пустой.

ThyQ
09.07.2009, 23:53
ThyQ, я не увидел четко сформулированного вопроса.

В том-то и дело, что вопрос как-то даже сложно сформировать.
Из фразы "она будто уменьшает контент, оставляя часть свфки пустой" попытаюсь предположить, что контент не должен уменьшаться, и тем более не оставлять часть свфки пустой.
Именно... содержимое должно заполнять всё выделяемое под свфку пространство.
Может я в алгоритме где-нить пропустил чего? Или просто какую-то мелочь ещё не знаю? Вы прикреплённый файл смотрели, там сразу видно что я имел в виду. (запускать надо хтмл файл, хотя думаю вы знаете)

Попробую переформировать вопрос:
Как заставить содержимое растянуться по всей области выделенной под свф так, чтобы не оставалось пустот?

Эти свойства read-only, изменить их вы не можете.
Спасибо, значит не туда ткнулся, буду знать. Пишу в АС 2.0 поэтому не могу могу обратиться к StageWidth

dimarik
10.07.2009, 00:02
Я посмотрел Ваш исходник. Оптимизированную версию выложу вскоре. Но главный затык в неправильном вычислении координат big_pic в обработчике someListener.onMouseMove

Попробуйте такой вариант:
this.big_pic._x = -(Stage.width - this.big_pic._width) / 2 * (1 - this._xmouse / Stage.width);
c this.big_pic._y аналогично.

ThyQ
10.07.2009, 02:51
Но главный затык в неправильном вычислении координат big_pic в обработчике someListener.onMouseMove
Но ведь по моей формуле он указывает именно в ту точку куда надо и смещает отлично. Еслиб только фоновое изображение растягивалось на всю область...:umnik2:
Прошу прощения, но предоставленная Вами формула работает недостаточно корректно, смещение не точное, изображение под маской не соответствует точке на видимом, "фоновом" изображении
Моя формула работает именно так как надо...по крайней мере по отношению к маске.
Может дело в том, что при создани fla у меня стоит 800х600 (размер рабочей площади указываемый в самом приложени)? Есть ли возможность изменять её?

dimarik
10.07.2009, 13:05
Осилил.

ThyQ
10.07.2009, 18:47
Осилил.
Большое спасибо, очень поучительно, код просо прекрасен.
Но мой вопрос здесь всё же не решился...точнее задал я его наверное некоректно, за что многократно извиняюсь.
Выспавшись, переформирую вопрос:
Вставляемая видимая фотка должна занимать всю площадь свфки, которая в свою очередь принимает переданные из хтмл значения.
Т.е. если передаю из хтмла параметры: 400х400 то и фотка и свфка принимают размеры 400х400, передаю параметры: 1024х768, то и фотка в свфке и свфка принимают эти размеры. А в моём случае получается что фотка 600х800, но вставляет он её будто уменьшенной ~ 500х665, а остальная область остаётся пустой.
В осиленном Вами примере вы вовсе не передаёте значения размеров растянутой (в случае, если вставляемая фотка меньше от природы) фотки.
Как же эту фотку растянуть от "края до края" самой свфки? Вместить её (фотку) заполнив всё внутреннее пространство?Должен же быть какой-то метод?

dimarik
10.07.2009, 19:01
Изменяйте размер флешки из JavaScript. Я вкладывал объект FP в таблицу и изменял ее размер. Можно воспользоваться классом ExternalInterface, чтобы передавать странице нужные размеры, после загрузки картинки.

ThyQ
11.07.2009, 01:31
А без Яваскрипта сделать это никак? Внутри флешки, с помошью AS 2.0
Он ведь беспорядок наводит в самой свфке.

dimarik
13.07.2009, 09:26
Изменить размер Stage изнутри флешки средствами AS нельзя.
Только через методы хостящего приложения. JavaScript - для браузера, но вызвать его можно изнутри
Типа
ExternalInterface.call('function(){var container = document.flashContainer; container.width=800; container.height=600;}');

где container - это идентификатор таблицы или <div>, в которую вставлен объект FlashPlayer.

Если политикой безопасности allowScriptAccsess (устарело) или allowNetworking разрешено взаимодействие c хост-приложением, то размеры изменятся на указанные.