Что нельзя оставлять на последний день перед открытием выставки

В 2025 году мой интерактивный экспонат подвёл при посетителях: нажатие при смене страницы срабатывало уже на новой кнопке. Теперь я проверяю это первым делом.

На последний день нельзя оставлять проверку экспоната глазами посетителя: быстрые повторные нажатия, нажатие во время перехода между страницами и возврат на главную. Эту проверку делают на готовых материалах, которые экспонат будет показывать на выставке, и на исправления после неё тоже нужно время. В тот раз материалы для экспоната пришли почти перед открытием, проверить я не успел, и ошибку нашли посетители.

Я пишу программы для интерактивных экспонатов и сам запускаю их на выставках и в музеях.

Автор за ноутбуком правит программу рядом с сенсорным киоском». Тема «Разработка»
Автор за ноутбуком правит программу рядом с сенсорным киоском». Тема «Разработка»

Что случилось на открытой выставке

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

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

Пришлось выкручиваться и объяснять, что подвела техника. На деле это был мой просчёт. Материалы отдали почти перед открытием, и проверить на них экспонат я не успел.

Как только мне об этом сообщили, я сел за компьютер и исправил ошибку. Через 15 минут на выставке уже работала обновлённая версия. Это было неприятно.

Почему ломается то, чего не ждут

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

Часто у меня встречались ошибки в обработке нажатий:

  • два-три быстрых резких нажатия подряд переключали экспонат не туда;
  • во время перехода кнопка на новой странице ещё не появилась, но фон под ней уже принимал нажатие;
  • где-то я забывал отключить кнопку.

Так бывает, когда программу делают в спешке. Такие ошибки я допускал на первых порах, когда опыта было мало.

На месте я начинаю с кнопок. Стараюсь при этом абстрагироваться от того, что делал программу сам, и действую как обычный посетитель: нажимаю то, что хочется нажать. Помогает насмотренность: я видел, что делают посетители у интерактивных экспонатов.

Полсекунды, пока проявляется новая страница

Самой большой из этих ошибок была та, что подвела меня в 2025 году: я забывал отключать нажатия на время перехода. Теперь правило такое: пока новая страница полностью не появилась, нажатия не срабатывают. Переход у меня длится секунду: полсекунды гаснет старая страница и полсекунды проявляется новая. Пока она не появилась полностью, её кнопки неактивны, чтобы посетитель не нажал их случайно.

В моих программах на C# с библиотекой интерфейсов Avalonia на время самого перехода поверх всего окна ложится прозрачный слой: он появляется вместе с началом анимации и прячется, когда она закончилась. Пока слой лежит, все нажатия достаются ему, и до кнопок под ним они не доходят.

<!-- последним в окне, поверх всех страниц; IsTransitioning поднят, пока идёт переход --> <Border IsVisible="{Binding IsTransitioning}" Background="Transparent" />

Слою нужен фон, пусть и прозрачный. По документации Avalonia, элемент без фона не участвует в проверке нажатий на своей пустой части, поэтому слой без фона пропустил бы их к кнопкам. Чтобы на нажатия откликалась вся площадь элемента, там же советуют задать Background="Transparent".

Проверку блокировки я теперь делаю первой, когда прихожу к экспонату.

Вторая проверка: возврат на главную

Вторым я проверяю, сбрасывается ли экспонат при возврате на главную и правильно ли работает конечный автомат. Так называют схему всех страниц и состояний экспоната с переходами между ними.

Сейчас я стараюсь заранее описывать экспонат такой схемой: куда переходить, что делать по каждой кнопке, какой сценарий запускать на каждое действие посетителя. Посетитель этой логики не замечает, пока всё работает. Но решений в ней много, и часть из них принимается по месту:

  • когда запускать отсчёт бездействия, после которого экспонат вернётся к началу;
  • открывается ли страница после перехода с самого начала или программа запоминает последнее действие и возвращает посетителя туда, где он остановился;
  • нужно ли сбрасывать прокрутку, когда посетитель возвращается на главную.

Такие вещи я делаю постоянно, и больше всего времени у меня ушло на ядро для них. По сути, это своя основа поверх готовых библиотек: в ней собраны переходы, отсчёт бездействия, сброс прокрутки и сама схема состояний.

Сброс я проверяю так: открываю страницу, прокручиваю её, возвращаюсь на главную, снова захожу на эту страницу и смотрю, сбросилась ли она так, как задумано.

Что нельзя оставлять на последний день

До открытия на каждом экране стоит пройти три проверки:

  1. Быстрые нажатия. Нажмите каждую кнопку, которая открывает другую страницу, два-три раза подряд. Экспонат должен сделать один переход.
  2. Нажатие во время перехода. Пока страницы сменяются, нажмите туда, где появится новая кнопка. Экспонат не должен на это ответить.
  3. Возврат на главную. Откройте страницу, прокрутите её, вернитесь на главную и зайдите снова. Страница должна открыться так, как задумано: с самого начала или с того же места.

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

Ту ошибку 2025 года первыми нашли посетители. Теперь я ищу её первым.

А какую ошибку в ваших проектах пользователи нашли раньше вас?