Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.01.2014, 15:21
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 1  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
По умолчанию Перемещение, ресайзинг и т.п. объектов с помощью мыши.

Здравствуйте.
Необходимо сделать некий компонент, который поддерживает рисование в нем прямоугольников их перемещение и изменение размеров. Все с помощью мыши. Несмотря на то, что задача довольно простая - у меня возникли с ней некоторые трудности.
Я год не разрабатывал на флексе, поэтому первым делом появилась такая идея: иметь некий контейнер фиксированного размера; иметь некий компонент, который будет отвечать за отрисовку прямоугольников их перемещение и изменение размеров, будет помещаться в описанный ранее контейнер и занимать всю его высоту и ширину. В компоненте-прямоугольнике я хотел в mxml описать собственно сам прямоугольник и 4 квадрата по бокам, которые будут выполнять роль рамки для ресайзинга, как-то по-хитрому забайндить их координаты и размеры между собой и применить стандартный механизм пермещения - startDrag/stopDrag. Тут же всплыл первый подводный камень - во время перетаскивания координаты объекта не меняются (ведь создается временный объект) и соответственно координаты и размерности прямоугольника не обновляются.
Хорошо. Я написал свою обработку событий мыши в компоненте-прямоугольнике. Сейчас имеется различие нажатий на рамку, прямоугольник, перемещение, ресайзинг и т.п. Но, всплыл другой "косяк" - компонент-прмоугольник занимает всю ширину/высоту контейнера, в то время как сам прямоугольник внтри него мал. Т.е. у меня огромная прозрачная зона, которая либо перехватывает все события от мыши, либо нет. В первом случае из всех компонентов-прямоугольников из контейнера я могу работать только с одним ("верхним"). Во втором при захвате и перемещении рамки или границы курсор часто выходит за пределы отрисованной зоны и попадает в зону прозрачности, которая событий от мыши не получает и соотвественно происходят застревания.

Как лучше всего решить поставленную задачу? Могу предоставить код, который я уже написал.

Старый 04.01.2014, 15:48
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вот тут drag, которого не глючит от выхода мышки за пределы. Но Вам нужно на flex... по этому мой пример может и не поможет..

Старый 04.01.2014, 17:50
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 3  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Вроде как я сделал то, что хотел. Но есть 1 нюанс. Я изменяю компонентам ширину, высоту и позицию динамически, когда получаю mouseMove. Это приводит к тому, что компоненты моргают при перерисовке, остаются видны старые позиции на некоторое время и т.п. Как можно этого избежать?

Старый 04.01.2014, 18:12
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Сгладить мерцание, поможет -
Код AS3:
private function mouseMoveHandler(event:MouseEvent):void 
{
	event.updateAfterEvent();
}
а если не поможет, то это, скорее всего, из-за не округлённых координат. И я не знаю как с этим бороться.
Цитата:
остаются видны старые позиции на некоторое время и т.п.
Такого я не когда не видел, вроде не должно такого быть..

Добавлено через 12 минут
Цитата:
Может быть я могу куда-то залить билд, чтобы было ясно в чем дело?
Самый лучший вариант, если Вы прям в сообщение вставите swf, чтобы было видно мерцание и код,
который у Вас за это отвечает. А то немного не представляется, как у Вас там всё

Старый 04.01.2014, 18:26
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 5  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Предложенное вами решение сделало отрисовку гораздо плавнее, но проблемы с мерцанием остались.
Прикладываю исходники. Там всего 2 компонента.
Вложения
Тип файла: zip editor.zip (2.4 Кб, 208 просмотров)

Старый 04.01.2014, 18:38
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Sonet Вам придётся ждать тех, кто понимает flex, я если честно даже запустить не могу. Да и как решить проблему с мерцанием я тоже не знаю, ещё не дошел до этого.
На сколько я знаю, мерцать может из-за не округлённых координат, то есть, координата object.x = 3.0015, а не object.x=3. И вот флеш плеер плохо рисует по расчётам таких координат. Решается вроде маленьким blur'ом, размытием, но возможно есть какие то более простые решения. У bitmap есть вроде - сглаживание.

Старый 04.01.2014, 18:42
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 7  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Akopalipsis
Попробовал округлять координаты перед высталвением - не помогло.
Значит подожду)

Старый 08.01.2014, 19:43
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 8  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Самый лучший вариант, если Вы прям в сообщение вставите swf, чтобы было видно мерцание и код,
который у Вас за это отвечает. А то немного не представляется, как у Вас там всё
Вот swf.
Вложения
Тип файла: swf Editor.swf (44.3 Кб, 154 просмотров)
Тип файла: zip release.zip (1.42 Мб, 198 просмотров)

Старый 08.01.2014, 20:16
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 9  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
скорее всего продлема в точке регистрации, когда вы задаете
Код AS3:
 box.width = newWidth;
так как точка регистрации находится по центру, то и прямоугольник будет растянут в две стороны.

попробуйте поменять местами строки вот так:

Код AS3:
box.width = newWidth;
box.height = newHeight;
box.x = newX;
box.y = newY;
почему бы не отрисовывать прямоугольники через графикс?

Старый 09.01.2014, 13:31
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 10  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Цитата:
Сообщение от Isfet Посмотреть сообщение
скорее всего продлема в точке регистрации, когда вы задаете
Код AS3:
 box.width = newWidth;
так как точка регистрации находится по центру, то и прямоугольник будет растянут в две стороны.

попробуйте поменять местами строки вот так:

Код AS3:
box.width = newWidth;
box.height = newHeight;
box.x = newX;
box.y = newY;
почему бы не отрисовывать прямоугольники через графикс?
Не помогло.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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