Вид решают мелочи
Вылизывайте крупные панели сколько угодно — глаз всё равно цепляется за мелочь: слово, разорванное надвое, обрезанное свечение, тесный слот. Четыре такие мелочи были указаны 2026-09-13 и исправлены в виджетах и темах, а не в демонстрационном экране, так что тот же результат получает каждый экран.
| Что было видно | Причина | Исправление |
|---|---|---|
У обучающей подсказки Done превращалось в Don/e |
Кнопка с включённым переносом вычитает ширину своего текста из минимума — сожмите её, и она разорвётся внутри слова | GoStyle.fit_words(): одно слово не переносится никогда; несколько слов переносятся, но самое длинное слово всегда помещается — и судят по отображаемому тексту, а не по ключу перевода, а форма применяет это заново при смене языка |
| У кнопки во всю ширину свечение обрезалось по вертикали слева | Контейнер прокрутки обрезает всё по своему краю, без исключений. Уцелел только правый край — благодаря жёлобу под полосу | GoScroll занимает у родителя отступ, чтобы отодвинуть свой край на 12dp наружу, и возвращает его внутри — содержимое остаётся на месте |
| Время, иконка и количество встали в слоте столбиком | Три ряда внутри 48dp | Крупная иконка по центру, горячая клавиша слева вверху, количество — значком справа внизу, оставшееся время — значком поверх иконки; панели значков берутся из badge_box() скина |
| Плоский выпадающий список без видимого выбора | Наведение на пункт использовало панель кнопки, а радиометки были бледными стандартными метками движка | Отдельная панель наведения (мягкая акцентная подкраска), та же графика радиокнопок, что и у флажков, высота пункта под палец |
Давайте кнопкам без подписи описание через GoStyle.icon_button(icon, action, -1, tooltip_key) —
и всплывающая подсказка для мыши, и имя для программ чтения с экрана берутся из этого одного значения.
Подсказку gohud рисует сам: стандартная подсказка движка разбивает текст по одному символу на строку,
когда её расчёт ширины идёт не так (измерено на ширине 1dp).
Карточка обучающей подсказки держится в стороне от неподвижных элементов
В альбомной ориентации карточку раньше отправляло к самому верхнему или нижнему краю — ровно туда, где живут шапки
и элементы HUD; в демо она садилась на → × в шапке. Теперь она держится на одном уровне с целью,
обходит любой GoHudAnchor, который резервирует место, и принимает прочие препятствия через
keep_clear. Она смещается на кратчайшее расстояние, которое обходит препятствие, не закрывая
цель, и остаётся на месте, когда экран слишком мал, чтобы обойти всё, — перекрытие лучше исчезновения.
Её глубина — то, за счёт чего она читается над страницей, — задаётся регуляторами скина
(float_shadow_size, float_shadow_lift, float_shadow_alpha; скины со срезанными углами используют float_glow_size).
tour.keep_clear = [header_bar, toolbar] # неподвижные элементы, которые не являются якорями
Экраны с мышью и клавиатурой
У пальца нет состояния наведения. Разрабатывайте только под мобильные — и два состояния, существующие
лишь на настольном компьютере, останутся непроверенными; одно из них и было сломано: у gohud кольцо фокуса
было невидимо на основной кнопке. Панель была акцентного цвета, и кольцо тоже: 1.00:1, один и тот же
цвет, нарисованный поверх себя. При перемещении с клавиатуры понять, где вы находитесь, было нельзя.
Залитые кнопки (GoPrimaryButton, GoDangerSolidButton) используют кольцо,
контрастное их собственной панели: тёмное в тёмной теме, белое в светлой, тёмная прицельная скобка
в sci-fi. Проверка контраста измеряет кольцо фокуса относительно панели, на которой оно лежит, поэтому
правило переживает смену палитры (WCAG 2.4.11 требует 3:1 для индикаторов фокуса).
Виджеты HUD
GoHudAnchor — девять точек
Учитывает безопасную область и краевые отступы. Задайте ему landscape_spot — и он переедет
в альбомной ориентации: элементы управления, стоящие снизу по центру в книжной, могут уйти вправо вниз.
Как держать содержимое из-под HUD
Когда прокручиваемый экран делит дисплей с HUD, содержимое уезжает под него, и два набора текста накладываются, пока не перестают читаться оба. В этом аддоне такое случалось дважды: подсказка поля ввода выдавливалась между быстрыми слотами, а рукоятка переключателя в настройках садилась на полосу здоровья.
form.avoid_hud = true # обходить каждый видимый GoHudAnchor
joystick_anchor.reserve_space = false # …кроме тех, что появляются только под пальцем
Каждый прямоугольник обходится в том направлении, где теряется меньше площади. Полоса в правом верхнем углу обходится вниз на телефоне в книжной ориентации (13% высоты) и вбок — в альбомной (21% ширины): обход по вертикали в альбомной стоил бы 27% экрана. Уже отданная площадь вычитается до того, как будет измерен следующий прямоугольник.
Элементы HUD сталкиваются и друг с другом
Девять точек делят экран; они не гарантируют, что элементы разойдутся между собой. Широкий снекбар сверху по центру садился прямо на полосу здоровья справа вверху и прятал значение — сколько осталось здоровья, прочесть было нельзя.
notice_anchor.avoid_peers = true # садится под закреплённый HUD
notice_anchor.reserve_space = false # и не двигает страницу, пока висит
Он отходит только по вертикали — смещение ещё и вбок заставляло бы центрированное уведомление появляться каждый раз в новом месте. И обходит он только те элементы, которые не отходят сами: если уступают оба, эти двое будут меняться местами вечно.
GoBar — здоровье, мана, опыт
var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL) # токен только для заливки
hp.set_values(320, 500) # "320 / 500"
Изменения плавно идут 0.18с — полоса здоровья, которая прыгает, не рассказывает, насколько сильно вас ударили.
reduce_motion делает их мгновенными. Большие числа сокращаются до 12.3k, чтобы
ширина полосы не дёргалась от появления и исчезновения цифр.
GoSlot — один быстрый слот
Иконка, количество, перезарядка и горячая клавиша на одной лицевой панели. Если навешивать значки на маленький круг, каждый слот получает свою ширину и ряд начинает гулять.
touch_peers.
keyboard_focus по умолчанию выключен, чтобы ряд из восьми слотов не вставал между пользователем
клавиатуры и всеми элементами настроек в порядке обхода Tab. Включайте его, когда клавиатура или геймпад — единственный ввод.
GoJoystick — виртуальный стик
| Режим | Поведение |
|---|---|
FIXED | Всегда на одном месте — легко найти, не глядя |
FOLLOW | Появляется там, куда лёг большой палец |
RELATIVE | Продолжает следовать за пальцем после появления — удобно для долгого движения |
Длина Vector2 из сигнала moved лежит в пределах 0–1, поэтому его можно сразу
умножать на скорость; от размера экрана и DPI он не зависит.
GoIconButton — выглядит маленькой, нажимается большой
touch_peers.