PDA

Просмотр полной версии : Масштабирование объекта в окне


StasHappy
17.01.2013, 21:16
Привет!

В html, при вставке Flash объекта на страницу, есть такой параметр:
<param name='scale' value='noborder'/>

который изменяет размер анимации, пропорционально, а лишние полоски по бокам, скрывает. Как можно сделать тоже самое в ActionScript? Я пробовал сам высчитать высоту, ширину и позицию обьекта, не получилось.

Если скажем, размер рабочей области составляет 640x480 пикс, а обьект, пусть будет 1024x600 пикс. И значит, если уменьшить наш обьект, относительно меньшей стороны, до размера рабочей области, получаем 819x480 пикс. Ну а далее, помещаем, наш уменьшенный обьект в рабочую область и смещаем влево по x координате на "(819-640)/2". То же самое применительно, если и высота обьекта, больше его ширины.

Как реализовать это в коде?:)

StasHappy
17.01.2013, 22:02
Пробовал менять Параметры Публикации. Не помогло.

GBee
17.01.2013, 22:16
scaleX, scaleY у стейджа или другого папы.

Riki
18.01.2013, 00:23
function resizePicture() {
var delitel=0;
pLoader.x=0;
pLoader.y=0;
if (pLoader.width>fotoHolder_Width || pLoader.width<fotoHolder_Width) {
delitel=pLoader.width/fotoHolder_Width;
pLoader.width=pLoader.width/delitel;
pLoader.height=pLoader.height/delitel;
}

if (pLoader.height>fotoHolder_Height || pLoader.height>fotoHolder_Height) {
delitel=pLoader.height/fotoHolder_Height;
pLoader.height=pLoader.height/delitel;
pLoader.width=pLoader.width/delitel;
}
pLoader.x=(fotoHolder_Width-pLoader.width)/2;
pLoader.y=(fotoHolder_Height-pLoader.height)/2;
trace("resized");
}

pLoader - загруженная картинка
fotoHolder_Width - высота контейнера
fotoHolder_Height - ширина контейнера

StasHappy
18.01.2013, 01:09
Благодарю. Скачал какой то ролик, с этого адреса:http://psycity.ru/design_img/overstep/absynth.swf, чтобы протестить...
Вставил его в свою сцену. Вот что получилось(изображение), в результате компиляции. Уверены, может где недочет в коде? Или сама флешка у них корявая какая то?:)

StasHappy
18.01.2013, 21:49
if (pLoader.height>fotoHolder_Height || pLoader.height>fotoHolder_Height) {
В этой строке, в знаках сравнения, нет ошибок?

Riki
19.01.2013, 21:09
Благодарю. Скачал какой то ролик, с этого адреса:http://psycity.ru/design_img/overstep/absynth.swf, чтобы протестить...
Вставил его в свою сцену. Вот что получилось(изображение), в результате компиляции. Уверены, может где недочет в коде? Или сама флешка у них корявая какая то?:)

Что вам здесь, не нравится?
Все верно сделано.

StasHappy
19.01.2013, 21:25
Вот здесь, почему одно и тоже, проверяем два раза? По моему здесь что-то не так.
if (pLoader.height>fotoHolder_Height || pLoader.height>fotoHolder_Height) {

Я исправил на это:
if (pLoader.height<fotoHolder_Height) {

Проблема сразу разрешилась. Обьект, стал пропорционально масштабироваться на всю рабочую область. Благодарю за помощь!:-)

Riki
19.01.2013, 23:36
Понимаете в чем дело, мы не одно и то же проверяем, мы проверяем для картинок которые меньше контейнера, и для которые больше контейнера, поэтому там два условия, а между ними or(||, "или" по-русски)

И исходный файл, очень в редких случаях будет масштабироваться на весь контейнер(не смотря на то что таких вариантов может быть бесконечно, но все же, в реальной жизни не много будет таких картинок которые будут именно "пропорционально" масштабироваться на весь контейнер, если вам конечно надо "пропорционально", а не наоборот :-) )

StasHappy
20.01.2013, 00:56
Хм... Я в недоумении. В проверяемом вами условии, оба знака сравнения, в одну и ту же сторону. А левое и правое условия, идентичны. Это получается тоже самое, что и:

if(A>B || A>B) {
// other code...
}
Не могу уловить логики данных операций.:-))

В общем, вот тут я начеркал в Фотошопе наглядный пример, поставленной задачи.

Riki
20.01.2013, 23:02
Ой, Господи ну ошибся в знаке, проблема поменять?(притом выше есть пример для width)

Ну поставленная задача, это никак не пропорциональное масштабирование(Загуглите что вообще такое пропорция).

И теперь для меня вообще огромный вопрос, в чем проблема реализации была? Ведь нужно было тупо, поменять значения width и height для картинки на соответствующие значения для контейнера.


Вот здесь, почему одно и тоже, проверяем два раза? По моему здесь что-то не так.
Код AS3:
if (pLoader.height>fotoHolder_Height || pLoader.height>fotoHolder_Height) {
Я исправил на это:
Код AS3:
if (pLoader.height<fotoHolder_Height) {
Проблема сразу разрешилась. Обьект, стал пропорционально масштабироваться на всю рабочую область. Благодарю за помощь!:-)

И тут проблема НЕ разрешилась, а наоборот, просто условие для height выполняется, так как вы берете картинку больше чем контейнер(ведь вы поменяли условие что бы была проверка только для картинок меньше по высоте чем контейнер).


И последние 2 вопроса для Вас: вы программист? и где вы учитесь?

StasHappy
21.01.2013, 05:03
Ой, Господи ну ошибся в знаке, проблема поменять?(притом выше есть пример для width)
Вот вот, я же говорил что здесь чтото не так.:)

Вчера после работы, посидел чутка с тетрадкой и калькулятором. У меня вышел такой вариант:

if(ldr.width!=stage.stageWidth && ldr.height!=stage.stageHeight) {
var delitel;

if (ldr.width>stage.stageWidth && ldr.height>stage.stageHeight) {
if(ldr.width!=ldr.height) {
if(ldr.width>ldr.height) {
if(ldr.width/ldr.height<=stage.stageWidth/stage.stageHeight) {
delitel = ldr.width/stage.stageWidth;
ldr.width = ldr.width/delitel;
ldr.height = ldr.height/delitel;
} else {
delitel = ldr.height/stage.stageHeight;
ldr.width = ldr.width/delitel;
ldr.height = ldr.height/delitel;
}
} else {
delitel = ldr.width/stage.stageWidth;
ldr.width = ldr.width/delitel;
ldr.height = ldr.height/delitel;
}
} else {
delitel = ldr.width/stage.stageWidth;
ldr.width = ldr.width/delitel;
ldr.height = ldr.height/delitel;
}
}


if(ldr.width<stage.stageWidth && ldr.height>=stage.stageHeight) {
delitel = stage.stageWidth / ldr.width;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
}

if(ldr.width>=stage.stageWidth && ldr.height<stage.stageHeight) {
delitel = stage.stageHeight/ldr.height;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
}




if(ldr.width<stage.stageWidth && ldr.height<stage.stageHeight) {
if(ldr.width!=ldr.height) {
if(ldr.width>ldr.height) {
if(ldr.width/ldr.height>stage.stageWidth/stage.stageHeight) {
delitel = stage.stageHeight/ldr.height;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
} else {
delitel = stage.stageWidth/ldr.width;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
}
} else {
delitel = stage.stageWidth/ldr.width;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
}
} else {
delitel = stage.stageWidth/ldr.width;
ldr.width = ldr.width*delitel;
ldr.height = ldr.height*delitel;
}
}


}

Где ldr - это наш обьект. Данный код, расчитан на альбомный тип окна(другой мне в общем то сейчас и не нужен).

И последние 2 вопроса для Вас: вы программист? и где вы учитесь?
А насчет этого.. Да нет, я уже давно отучился. А из программирования, работал только с С++ и PHP.