Моя первая программа под Flipper Zero
Вчера вечером разобрался-таки с прокруткой экрана для «песни про пиво» под Флиппер Зеро и выложил всё в репозиторий.
Как я уже писал, документации на удивление мало, пришлось налегать на чужие исходники. Если касаться темы прокрутки экрана, то, по всей видимости, существуют два способа: перерисовывать экран самостоятельно, вызывая каждый раз компонент полосы прокрутки с нужным значением или заморочиться с созданием так называемой «сцены», разместить на ней виджет прокручиваемого текста и засунуть туда весь текст, который надо прокручивать, целиком.
Второй способ больше подходит для многоэкранных приложений, поэтому его я не выбрал — для моих целей там слишком много мороки. Поэтому в этой части всё получилось достаточно просто:
void beer_render_callback(Canvas* canvas, void* ctx) {
// …
elements_scrollbar(canvas, BEER_MAX - pos, BEER_MAX + 1);
// …
}
int32_t beer_main(void* p) {
// …
switch (event.key) {
case InputKeyDown:
if (app->pos > 0) app->pos--;
break;
case InputKeyUp:
if (app->pos < BEER_MAX) app->pos++;
break;
default:
break;
}
view_port_update(app->view_port);
// …
}
В цикле опроса клавиатуры ловим клавиши «вверх» и «вниз», в соответствии с клавишей увеличиваем или уменьшаем счётчик, после чего вызываем перерисовку, в коллбеке которой выводим экран и полосу прокрутки с правильной позицией.
Возможно сделаю ещё автоскроллинг экрана на длинное нажатие клавиши, но пока не уверен, что мне хочется — может лучше за что-нибудь более серьёзное сесть.
of beer дублируется из-за того, что есть одновременно в beer_plural() и в строке формата furi_string_printf().
Оу, я даже не заметил, что у меня ошибка! Спасибо! )