Событие Long Touch с таймером и блоком подтверждения для развертывания iOS в AS3

У меня есть проект, где у меня есть список прокрутки. Я хотел бы, чтобы мой пользователь мог "долго касаться" элемента в списке, чтобы они могли его удалить.

Я занимаюсь разработкой в ​​Air для iOS с использованием Flash CS6, поэтому я не очень много знаю о подходящих жестах MultiTouch для развертывания iOS.

На мой взгляд, шаги анимации я хотел бы пойти так...

  1. Ранее невидимая кнопка с именем btn_delete внутри мувиклипа Item появится, когда Long Touch запускается + начинается таймер
  2. Промежуточный шаг: btn_delete повернется на 90 градусов, используя TweenMax Rotate (я это рассмотрел)
  3. Последний шаг: когда таймер достигнет своего завершения, появится диалоговое окно / окно подтверждения и спросит пользователя, уверены ли они, хотят ли они удалить элемент.

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

function exampleFunction {
    _item.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
}

//-- Long Press Listener Functions--//
function onTouchBegin(eBegin:TouchEvent) {
    trace("start");
}

function onTouchRotate(eEnd:TouchEvent) {
    trace("rotation of image");
}

function onTouchEnd(eEnd:TouchEvent) {
    trace("end");
}

Если у кого-то есть фрагмент кода, который он уже написал, который примерно соответствует моим критериям, пожалуйста, опубликуйте его!

1 ответ

Решение

Я бы просто использовал MouseEvent за это.

var timer:Timer = new Timer( 500 ); //ms
timer.addEventListener( TimerEvent.TIMER_COMPLETE, timerCompleteHandler );

listItem.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );

function mouseDownHandler( e:MouseEvent ):void {
    timer.start();
    stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}

function mouseUpHandler( e:MouseEvent ):void {
    //just some clean up to reset the timer and remove the mouse up event listener from the stage 
    timer.reset();
    stage.removeEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}

function timerCompleteHandler( e:TimerEvent ):void {
    timer.reset();
    stage.removeEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );

    //do delete actions here
}

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

Я использую MouseEvent здесь только потому, что он ведет себя идентично TouchEvent (по большей части) в этом случае, и его можно использовать на рабочем столе (это означает, что вы можете протестировать в эмуляторе и добавить его в другие проекты, если хотите))

ОБНОВЛЕНИЕ: Просто перечитал ваш вопрос и понял, что я пропустил поворот. Для этого просто добавьте еще один таймер с отдельным завершенным обработчиком, который и в этой функции ТОЛЬКО выполняет вращение и сбрасывает этот таймер.

Другие вопросы по тегам