@i_4_2 на мой взгляд сверху система выглядит примерно так. Есть поток событий Press/Move/Release. Эти события мы буферизируем и по этому кешу вангуем то, что нам надо.
При получении событий Press/Release создаём некие метки и/или очищаем неактуальщину. Как минимум храним ещё и is_pressed.
Если мы внутри тача, то фильтруем события Move с учётом времени и положения одновременно.
Если между Press/Release прошло мало времени и/или мало расстояния, то мы можем задетектить Tap.