По душе · Android × Figma · 12.09.2026 · профиль

Седьмой десяток: страница «Профиль» собрана целиком

Пятьдесят пять кадров: вся страница «Профиль» (54 кадра) плюс хвост «Афиши» — единственный из её 117 кадров, оставшийся без съёмки в третьем десятке. Сам профиль во всех состояниях, подсказки, выбор статуса и лист местоположения, QR‑код пользователя, поп‑апы регистрации, редактирование, «Мои события», «История» и «Скидки», страница события и карта из профиля, регистрация из профиля в три шага, обновлённый профиль с разделом «Куда иду». Четыре экрана написаны с нуля, остальные — состояния и экземпляры уже собранных. Каждый кадр собран из данных ноды и сведён с рендером Figma в масштабе ×3.

51 / 54кадров с зелёной геометрией при пороге 0,3 %
0,009 %лучшая геометрия десятка
0,530 %худшая — копия мастера карты с её растром
16расхождений найдено, все закрыты
4поправки к измерителям, каждая с замером

Смотровая

Кадр рядом с рендером

Тяните шторку, чтобы совместить макет и приложение. «Карта» показывает, где остаётся расхождение: синим закрыт системный статус‑бар, клавиатура и системные листы iOS — их рисует система, в сравнении они не участвуют (спека 6.4). Кадры выше экрана (до 1365 dp) снимаются полосами по 844 и склеиваются.

Рендер кадра из Figma Снимок экрана приложения

Числа

Четыре измерения на кадр

Полное — доля пикселей, отличающихся сильнее ΔE 6 вне масок. Без текста — то же с исключёнными текстовыми блоками. ±1 px — пиксель считается расхождением, только если не совпал ни с одним пикселем рендера в окне ±1: сдвиг растра на долю пикселя не есть ошибка вёрстки. Геометрия — два последних вместе, то есть чистая форма, положение и материал; по ней и выносится вердикт. Подсвечены строки выше порога — у каждой измеренная причина в разделе «Границы».

ЭкранКадрСостояние Полное %Без текста % ±1 px %Геометрия % Шкала до порога 0,3 %

Разбор

Что оказалось не так

Каждая строка — расхождение из реестра docs/figma/fig/ledger.md (F1‑1…F1‑16): что показала нода, что делало приложение и сколько это стоило в числах. Четыре первые находки — не про этот десяток, а про сами измерители: они врали одинаково на всех кадрах файла, и теперь исправлены.

Растры уменьшались не тем фильтром

3D‑иконки плиток профиля выглядели мягче рендера. Оказалось, дело не в размере и не в положении: инструмент вырезки растров уменьшал картинку ланцошем, а конвейер Figma — боксовым фильтром. Замер по рендеру: у 3D‑часов (окно 747 → 249 px) среднее расхождение по непрозрачным пикселям 0,47 уровня у HAMMING и BILINEAR, 0,61 у BOX и 6,81 у LANCZOS; у 3D‑скидки — 0,55 против 8,26. Ланцош звенел на кромке. После замены фильтра растр сходится с рендером до 0,6 уровня, а снимок — до 1,6.

6,81 → 0,47реестр F1-1
уровня на кромке

Четыре карточки «Похожих интересов» получали одно и то же фото

В разобранном .fig у всех четырёх карточек лежит sha растра мастера — переопределение инстанса там не разрешается. Верен ответ API: четыре разных imageRef. Инструмент вырезки научен брать sha из API (та же поправка, что и для мастеров компонентов) и обрезать заливку FILL по центру, а не сплющивать несквадратный исходник.

4 фотореестр F1-2
вместо одного

Значки шапки были тоньше, чем в рендере

У мастеров icon-qr-code и icon-cog-6-tooth толщина штриха 1,5, а экземпляры в шапке профиля переопределяют её на 2,0 — Figma перестраивает контур, а в .fig лежит контур мастера. Чернила в рендере 18,67 dp против 18,00 у нас при векторе 16,5. У генератора иконок появился режим, который строит контур из векторной сети и обводит его толщиной экземпляра.

0,269 → 0,252реестр F1-4
геометрия профиля

Кадр без заливки давал 9 % расхождения на ровном месте

У кадра 734:88319 «Афиши» в ноде fills: [], и 14 % его рендера прозрачны. В RGB прозрачное становится чёрным — сравнивать было не с чем. Под такими пикселями в ноде ничего не объявлено, и теперь они исключаются из метрики. Самопроверка: на непрозрачном кадре входа число не изменилось — 0,142.

9,094 → 0,051реестр F1-10
кадр 734:88319

Иконку плитки зажимал родитель

3D‑иконка 83 dp в плитке «История» высотой 80 сжималась до 80 и уезжала на 1,5 dp вверх и вправо: обычный модификатор размера в Compose ограничивается родителем. Поймано перебором смещений снимка против самого растра — снимок стоял на (0, −3) px.

0,411 → 0,257реестр F1-3
геометрия профиля

Лента и списки длиннее своего места — их обрезает кадр, а не сжимает

Лента «Похожих интересов» — две страницы по 330 с зазором 20 при ширине 358: в макете она вылезает за кадр и обрезается, вторая страница видна на 24 dp. Compose же сжимал обе. То же в «Истории» (пять карточек на 640) и «Скидках» (812 на 578): шапка дня налезала на карточку. Лечится снятием ограничения по размеру и обрезкой по странице.

0,932 → 0,019реестр F1-7, F1-8
«История» и мастер профиля

Снекбар «Промокод скопирован» размывает страницу под собой

У снекбара фоновое размытие 20, и на логотипе партнёра это видно. Фонового размытия в Compose нет: страница пишется в слой и рисуется под снекбаром второй раз — обрезанной по рамке узла, с размытием радиуса по формуле ядра и нормировкой у кромки. Перебор режимов краёв: без размытия 1,194, «зажать» 0,362, «повторить» 0,371, «отразить» 0,317, «прозрачно» с тройным наложением — 0,267.

1,194 → 0,267реестр F1-9
кадр 348:46985

Кольцо аватара градиентное не всегда

Обводка аватара 4 dp внутрь — вертикальный градиент от сиреневого к салатовому у верифицированных, и сплошная линия‑разделитель у трёх кадров без бейджа. Одинаковая обводка на всех кадрах выдавала себя целым кольцом на карте расхождений.

3 кадрареестр F1-5
732:77991 и соседи

Скругления соседних блоков разной природы

У белых блоков радиуса 40 сглаживание нулевое — это обычная дуга; у карточек внутри радиуса 24 оно равно единице — это squircle; у чипа района радиуса 24 — снова дуга. Форма угла видна кромкой во всю длину блока, поэтому каждый радиус берётся вместе со своим сглаживанием.

7 узловреестр F1-6
блоки и карточки

Лишняя точка в пилюле обложки — на страницах прошлого десятка тоже

Точек в пилюле столько, сколько фотографий у события: пилюля 66 при двух и 55 при одной. Рисовались две всегда — и это ехало не только на кадре профиля, но и на пяти кадрах созданного события пятого десятка. Правка улучшила и их: 0,235 → 0,196.

0,235 → 0,196реестр F1-16
688:59349 и четыре соседа

Мелочи, которые ловятся только вторым проходом

Строка района обрезается многоточием, а не переносится; чип «Указать статус» обведён пунктиром 8/4; значок «скопировать» в карточке скидки — цвета подписи, а не промокода; блок текста в «Профиль подтвержден» — 60, а не 98, иначе подпись уезжает на 16 dp вниз; подпись чипа «Саморазвитие» набрана голым чёрным вместо токена, и прожига над плашкой у неё поэтому нет.

F1-11…F1-15пять находок
все закрыты

Границы

Что осталось выше порога и почему

Пять кадров из 55. Ни один остаток не относится к вёрстке: два — копии уже закрытых кадров со своим известным остатком, два — стекло над неровной подложкой, один — растр карты.

КадрыГеометрия %Класс остатка
306:472490,529копия мастера «Страницы Карта» 180:8884 узел в узел: несёт его остаток растра карты (у самого мастера 0,530)
693:75062, 348:424160,407 и 0,406стекло неактивной кнопки «Событие завершено» над неровной подложкой: сквозь неё виден синий маркер карты, и профиль его яркости у нас мягче (замер по строке: рендер 79…117, снимок 94…109) — тот же класс, что у стеклянных чипов карты
348:43154, 348:45937обе 0,304копии кадра «Селфи» 287:26990 узел в узел; на том же прогоне сам оригинал даёт ровно 0,304 — это остаток области видоискателя, которая в сравнение не входит