#include <TFT_eSPI.h>
#include <LilyGo_AMOLED.h>
LilyGo_Class amoled;
TFT_eSPI TFT = TFT_eSPI();
TFT_eSprite RED = TFT_eSprite(&TFT);
TFT_eSprite BLUE = TFT_eSprite(&TFT);
TFT_eSprite GREEN = TFT_eSprite(&TFT);
void setup(void)
{
amoled.beginAMOLED_191();
RED.createSprite(536,240);
BLUE.createSprite(536,240);
GREEN.createSprite(536,240);
TEST1();
}
bool first = true;
void loop()
{
static int16_t x, y, x1, i;
bool touched = amoled.getPoint(&x, &y);
if (touched)
{
if (x1 - x > 100)
{
++i;
if (i > 2)
i = 0;
}
if (x - x1 > 100 )
{
--i;
if (i < 0)
i = 2;
}
}
else
{
x1 = x;
first = true;
}
if (touched && first)
{
x1 = x;
first = false;
}
if (i == 0)
CONNECTION();
else if (i == 1)
MEASUREMENT();
else if (i == 2)
OSCILLOSCOPE();
}
void TEST1()
{
RED.fillRect(0,0,536,240,TFT_RED);
amoled.pushColors(0,0,536,240,(uint16_t *)RED.getPointer());
}
void TEST2()
{
BLUE.fillRect(0,0,536,240,TFT_BLUE);
amoled.pushColors(0,0,536,240,(uint16_t *)BLUE.getPointer());
}
void TEST3()
{
GREEN.fillRect(0,0,536,240,TFT_GREEN);
amoled.pushColors(0,0,536,240,(uint16_t *)GREEN.getPointer());
}
Вроде код свайпает экраны, но если быстро нажать на экран, а затем нажать радом то он тоже это зачтёт за свайп. (если вдруг важно, на чём делаю, то на этом модуле (сенсорная версия) T-Display S3 AMOLED – LILYGO® )
Как правильно организовать свайп экранов?
В “штатных функциях” библиотек для сенсорных экранов отслеживается только факт касания экрана, а не факт отпускания или удержания на нём стилуса. Поэтому краткие касания от протяжки не отличаются. Это надо самому выдумывать используя миллис и делей. В моей теме про записку на ILI9488 есть вроде пример про писание текста от стилуса, там именно это, фиксируется событие отрыва стилуса от экрана для начала нового слова.
Свайп это несколько (более двух)последовательных нажатий , выполненных в определенном направлении и с определенной скоростью. Число нажатий, направление и скорость можно использовать для более точного выбора между свайпом и просто отдельными касаниями
Возможно скорость не главное. В Андроид, например, верхнюю шторку можно “вытянуть” как медленно, так и быстро.
Главное, чтобы между касаниями не было больших временных промежутков. Под “больших” подразумевается время, позволяющее совершить два последовательных тапа с макс. возможной скоростью.
Лучше делать на постоянной протяжке, тогда по её скорости ещё можно разделять события - быстрая протяжка или медленная. Я хотел поопытничать, но не вижу практически интересного применения.
Ты отреагировал на сообщение от @MMM, а я именно на него, так что вступление противоречит формальной логике.
Управляющий жест при работе с сенсорным экраном, при котором палец кладут на экран и проводят в каком-либо направлении. Викисловарь.
Касание - прикосновение к сенсорному экрану управляющим предметом (пальцем руки, ноги , стилусом и т.д) с последующим отрывом вышеупомянутого предмета от экрана. Касание может быть одиночным или многократным, длинным и коротким, приходится на одну и ту же область экрана или на разные, в т.ч и расположенные “рядом”.
Касание - постоянное воздействие на определенную область экрана. Размер этой области задается программой. Свайп - последовательное воздействие на соседние области экрана в определенном направлении.
Касание фиксируется если управляющий предмет оторван от экрана или не перемещается в течение опр. промежутка времени в пределах первоначальной области, в отличие от свайпа.
Прим 1.
Ввиду несовершенства сенсора может быть заложен временной интервал, в течение которого программа не реагирует на ложное отсутствие сигнала при касании либо свайпе. Этот интервал должен быть меньше, чем время, за которое человек физически способен совершить повторное касание…
Ну и давай без “я не про это спрашивал”. В вопросе ТС шла речь именно про даблтап в соседних областях экрана.
Не знаю, у меня на смартфоне прокрутка так: приложил палец и двигаешь по экрану, скорость прокрутки синхронизирована со скоростью пальца. Ни на какие серии быстрых касаний не реагирует. Явно фиксируется событие отрыва пальца от экрана для исключения реакции на это
МК не знает, что такое “жест”, что такое “палец” и что такое “проводят”. Чтобы найти решение задачи, ее нужно сформулировать в терминах понятных МК: высокий и низкий уровень, напряжение на аналоговом входе, дребезг, шум и т.д.
Ну вот и вышли на возможного виновника: неадекватная величина временного интервала.
Собственно, это универсальный метод решения подобных задач: представить себя на месте МК, а также сформулировать задачу в понятных терминах.
Собственно во втором сообщении @lilik всё написал. Для распознавания свайпа нужно распознавать два события - касание и отпускание, и смотреть разность их координат. Вот примерчик вроде как раз про это: Swipe Gestures Using a TFT Display
И готовые библиотеки про это есть, например: TouchEvent
…Коснулись пальцем экрана один раз и запустили приложение, провели пальцем по эрану вверх или вниз – прокрутили страницу (это действие носит название «скролл»), смахнули пальцем вправо или влево и перелистнули страницу ( «свайп»)…
if (touched && !first && is_touch)
{
if (x1 - x > 100)
{
++i;
if (i > 7)
i = 0;
first = true;
is_touch = false;
}
if (x - x1 > 100 )
{
--i;
if (i < 0)
i = 7;
first = true;
is_touch = false;
}
if (y - y1 > 100 )
{
if (n == 0)
n = 1;
if (n == 2)
n = 0;
first = true;
is_touch = false;
}
if (y1 - y > 100 )
{
if (n == 0)
n = 2;
if (n == 1)
n = 0;
first = true;
is_touch = false;
}
}
if (!touched)
{
y1 = y;
x1 = x;
first = true;
is_touch = true;
Serial.println(x);
}
if (touched && first)
{
x1 = x;
y1 = y;
first = false;
}