Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Изменение изображения путем перемещения маркера (http://www.flasher.ru/forum/showthread.php?t=142421)

greenhill 20.07.2010 20:07

Изменение изображения путем перемещения маркера
 
Здравствуйте
Подскажите, пожалуйста, как реализовать изменение высоты и ширины изображения, путем передвижения маркера.
Изображение подгружено в спрайт.

Спасибо

Mur4ik 20.07.2010 21:18

Есть изначальные координаты маркера, меняя его положение меняются его координаты. Исходя из этих данных несложно вычислить и изменить новые размеры изображения.

derhab 20.07.2010 21:21

если я правильно понял задачу..
например, для случая если маркер находится в нижнем правом углу изображения
Код AS1/AS2:

img.width = marker.х - img.х;
img.height = marker.y - img.y;

это при условии, что img имеет нулевую координату в своем левом верхнем углу и img и marker находятся в одном координатном пространстве, если нет, то пересчитывать локальные координаты в глобальные..

greenhill 20.07.2010 22:09

В AS2 я делала с помощью onEnterFrame, запускала эту ф-цию в момент перетаскивания, какой аналог или как сделать это на AS3?

Hidest 20.07.2010 23:44

Event.ENTER_FRAME напрашивается... можно по MouseEvent.MOUSE_MOVE

greenhill 20.07.2010 23:52

А как сделать, чтоб маркер который мы передвигаем, двигался только по прямой. Получается по диагонали картинки

Hidest 21.07.2010 01:47

Ну так проверяйте каждый раз, не выходит ли маркер за допустимые координаты. Или startDrag вам в помощь с заданием ограничений (подробнее в хелпе все расписано, но это только для ортогональных системы координат, соответственно, можете двигать маркер в своем прямоугольнике заданном). Если надо только по диагонали и никак иначе - пишите сами. Обычно при этом надо контролировать одно направление (например, большее - запоминаете предыдущее значение и сравниваете по x и y, маркер ушел дальше), по нему высчитывать scale по одной оси и делать такой же по другой.

Update: подумал, что большее значение и не к чему, просто смотрите, куда у вас идет маркер по оси X, а дальше двигайте его по Y исходя из соотношения сторон картинки. Но будьте готовы к тому, что в этом случае часто будет курсор уходить с маркера, в зависимости от движений мыши...

derhab 21.07.2010 04:00

Цитата:

Сообщение от Hidest (Сообщение 923794)
просто смотрите .. Но будьте готовы к тому, что.

а вот это правильно

greenhill 21.07.2010 12:38

Цитата:

Сообщение от Mur4ik (Сообщение 923735)
Есть изначальные координаты маркера, меняя его положение меняются его координаты. Исходя из этих данных несложно вычислить и изменить новые размеры изображения.

Вот мне сложно вычислить. Туго с геометрией в программировании. Может есть примерчик?

Mur4ik 21.07.2010 14:26

Тут нет геометрии по сути. Простые арифметические действия. Есть координаты и размеры картинки. В момент опускания мыши на маркер запоминаете координаты курсора, подписываетесь событие движения мыши. Дальше двигая мышь, изменяются координаты курсора. Вычитая из текущих координат курсора сохраненные (в момент когда нажали кнопку мыши) узнаем величину на которую нужно изменить размер изображение по той или иной оси (ширину или высоту).

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

Примерчик:
Была картинка 50х50 пикселей в координатах x=10 и y=10, взялись за нижний центральный маркер (т.е. нажали кнопку мыши), запомнили координаты мыши (это примерно x=35 и y=60) и отодвинули мышь вниз на координты x=40 (это мы не учитываем, т.к. нас только высота интересует) и y=75. Теперь считаем 75-60=15, значит высоту картинки нужно изменить на 15 пикселей (yourImage.height +=15) и смещаем маркер на координаты x=35 и y=75. Повторяем эти операции пока не отпустим кнопку мыши.

КорДум 21.07.2010 14:39

2 Mur4ik
Это же только тогда, когда длина полоски перетаскивания маркера равна той стороне, которую изменяет маркер, верно?

2 greenhill
Вообще нужно вычислить, чему равны пиксели в одном проценте от длины трека бегунка, затем перевести в десятичную дробь и текущее положение бегунка разделить на полученное значение. Получается, что если бегунок находится по середине трека, что означает 100%, и мы его двигаем, скажем, вверх, то должно произойти уменьшение картинки, то есть будет меньше 100%. Так же и наоборот.

координатаБегунка / (общаяДлинаТрека / 100)) / 100)
Вот как-то так я реализовывал скролл громкости.

Mur4ik 21.07.2010 14:42

2 КорДум, при чем здесь скролл?
Я так понял маркеры имеются ввиду как по типу в графических редакторах (маленькие квадратики по углам и центрам сторон изображения, таская которые, меняются параметры изображения).

greenhill 21.07.2010 14:44

это вроде ясно, а как двигать маркер, но чтоб он при этом двигался только по диагонали, под углом 45 градусов?

Mur4ik 21.07.2010 14:45

Цитата:

Сообщение от greenhill (Сообщение 923861)
это вроде ясно, а как двигать маркер, но чтоб он при этом двигался только по диагонали, под углом 45 градусов?

Очевидно нужно прибавлять на одинаковую величину и по "x" и по "y". Только знаки могут быть разным в зависимости от направления.
Например чтоб двигать вверх-вправо нужно
Код AS3:

marker.x += 20;
marker.y -= 20;


greenhill 21.07.2010 14:48

На одинаковую величину?
Но так ничего не меняется по сути. Надо чтоб маркер двигался по линии, когда я его двигаю. Чтоб за границы этой линии он не выходил. То есть его движения ограничены линией под 45 градусов. Что-то я не понимаю, сори :(

Mur4ik 21.07.2010 14:57

Цитата:

Сообщение от greenhill (Сообщение 923863)
На одинаковую величину?
Но так ничего не меняется по сути. Надо чтоб маркер двигался по линии, когда я его двигаю. Чтоб за границы этой линии он не выходил. То есть его движения ограничены линией под 45 градусов. Что-то я не понимаю, сори :(

Например ваш маркер находится в координатах 10,10 и вам нужно двигать его вправо-вверх под углом 45 градусов, значит нужно к текущей "х" координате прибавлять некую величину (назовем ее offset), а к текущей "у" координате прибавлять -offset (потому что положительные значения по "y" направлены вниз, а двигать нам нужно верх).

Код AS3:

// вправо-вверх
marker.x += offset;
marker.y -= offset;
 
// вправо-вниз
marker.x += offset;
marker.y += offset;
 
// влево-вверх
marker.x -= offset;
marker.y -= offset;
 
// влево-вниз
marker.x -= offset;
marker.y += offset;

Т.е. смещая на одинаковые расстояния положение маркера вы ограничиваете его линией, которая как раз и направлена под углом 45 градусов.
Но это в случае если изображение у вас квадратное всегда.

КорДум 21.07.2010 15:03

2 Mur4ik
ууу, точно, пардон.

greenhill 21.07.2010 15:08

Ага, это вроде понятно.
Чтоб просто двигать объектом у меня был такой когд:
Код AS3:

private function markerDown(event:MouseEvent){
        var sprite_marker:Sprite = Sprite(event.target);
        sprite_marker.startDrag();
            sprite_marker.addEventListener(MouseEvent.MOUSE_MOVE, markerMove);     
                }
 
        private function markerUp(event:MouseEvent){
            var sprite_marker:Sprite = Sprite(event.target);
            sprite_marker.stopDrag();
                        sprite_marker.removeEventListener(MouseEvent.MOUSE_MOVE, markerMove);
                }
 
        private function markerMove(event:MouseEvent):void {
              event.updateAfterEvent();
 
        }

Чтоб мне перемещать по диагонали, стартДраг мне уже не нужен. На что мне его заменить?

Mur4ik 21.07.2010 15:45

Вложений: 1
убирайте sprite_marker.start/stopDrag();

вместо
Код AS3:

sprite_marker.addEventListener(MouseEvent.MOUSE_MOVE, markerMove); 
...
sprite_marker.removeEventListener(MouseEvent.MOUSE_MOVE, markerMove);

нужно
Код AS3:

stage.addEventListener(MouseEvent.MOUSE_MOVE, markerMove); 
...
stage.removeEventListener(MouseEvent.MOUSE_MOVE, markerMove);

и в markerMove меняйте размеры изображения и относительно измененных размеров изображения меняйте положение вашего маркера.

greenhill 21.07.2010 16:07

Спасибо огромное. Я вас уже люблю :)


Часовой пояс GMT +4, время: 08:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.