Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Хорошая реализация CLICK + MOUSE_DOWN (http://www.flasher.ru/forum/showthread.php?t=205671)

Isfet 16.12.2013 09:06

Хорошая реализация CLICK + MOUSE_DOWN
 
К сожаления не нашел аналога работы виндосовского клика + mouseDown , Нашел только реализации типа
Добавляем таймер на проверку клика, если время между mouseDown и Up меньше скольки то там миллисекунд, то обрабатываем клик.

Но по идее клик - это когда сработал маусдаун, далее(возможно) произошло незначительное смещение курсора(человеческий фактор), прошло сколько угодно времени (может даже несколько секунд, все кликают по разному) потом сработал маусАп, - далее обрабатываем клик. Но как по правильному будет словить это вот незначительное смещение курсора, и правильно обработать mouseDown + mouseMove + mouseUp и click

caseyryan 16.12.2013 11:25

Что-то не понял проблемы. Зачем вообще ловить какое-то смещение? mouseUp отработает независимо от того было какое-то смещение или нет

Isfet 16.12.2013 12:00

как у меня сейчас:
есть переменная ключ - isClicked, по mouseDown ставлю ее true,

в хэндлере mouseMove - ставлю ее false

в хэндлере mouseUp -
Код AS3:

if (isClicked){
    onClick();
    return;
}
// дальше если нет клика делаем что-то по mouseUp

проблема такая - иногда , после маусдаун курсор немного сдвигается , когда жмешь на кнопку мыши, соответственно выполняется хэндлер mouseMove, и переменная ставится в false, и соответственно функция onClick() не выполняется(то есть клика не происходит ), что напрягает, нужно ее как-то обойти.

iNils 16.12.2013 12:18

Цитата:

аналога работы виндосовского клика + mouseDown
А что он делает?

alexandrratush 16.12.2013 12:19

Тогда можно сохранять mouseX и mouseY при нажатии в обработчике mouseDown, а в mouseMove проверять смещение курсора относительно этих сохраненных данных.

Isfet 16.12.2013 12:39

Цитата:

Сообщение от iNils (Сообщение 1155176)
А что он делает?

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



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

А, ну хотя можно хранить максимальное смещение, и его проверять..

fljot 16.12.2013 14:55

https://github.com/fljot/Gestouch

quickstart:
Код AS3:

var tap:TapGesture = new TapGesture(yourBar);
tap.addEventListener(GestureEvent.GESTURE_RECOGNIZED, onTap);
//tap.slop = 0;// например, так можно сдвигать только на 0 пикселей. по-умолчанию там подходящее для тачкринов значение
//tap.maxTapDuration = 2000;//например, так после 2 секунд "клика" уже не будет. по-умолчанию 1500мс
 
var pan:TapGesture = new PanGesture(yourBar);
pan.addEventListener(GestureEvent.GESTURE_BEGAN, onPan);
pan.addEventListener(GestureEvent.GESTURE_CHANGED, onPan);
 
... onPan(event:GestureEvent):void
{
    pan.offsetX/Y
}

при перемещении тап(клик) автоматически отменяется (если явно не указано обратное).

Там сейчас скорее всего есть одна беда с памятью, так что для хорошего удаления лучше использовать dispose() на жестах.

caseyryan 16.12.2013 17:45

Код AS3:

var lastMouseX:Number = 0;
var lastMouseY:Number = 0;
 
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
 
function onMouseDown(e:MouseEvent):void {
    lastMouseX = this.mouseX;
    lastMouseY = this.mouseY;
}
 
function onMouseUp(e:MouseEvent):void {
    // проверяем, если курсор не отъехал более, чем на 10 пикселей, то считаем это кликом
    if (Point.distance(new Point(lastMouseX, lastMouseY), new Point(this.mouseX, this.mouseY)) < 10) {
        onClick();
        return;
    }
}

Вот так, и не нужно ничего мудрить

Hauts 16.12.2013 18:02

Код AS3:

Point.distance(new Point(lastMouseX, lastMouseY), new Point(this.mouseX, this.MouseY))

Очень ленивая строчка :)

caseyryan 16.12.2013 19:23

да) не заметил ошибки) писал прямо здесь


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

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