Не иллюстрация — 232 настоящих штриха из examples/motorcycle.jpg, в том порядке, в котором они уходят на телефон.
Рисует любую картинку на экране Android, касаясь его.
Записывает и повторяет жесты. На телефон ничего не ставится.
USB или ADB по Wi-Fi · на большинстве устройств без root · без Android SDK · Python, OpenCV и adb лежат внутри приложения
57 штрихов, 478 точек — ровно тот список путей, что уходит на устройство. На Pixel 8 Pro меньше двух секунд.
| 1 | Установить: Windows .msi · macOS .dmg · Linux — из исходников. Подписи нет, поэтому Windows один раз скажет «неизвестный издатель», а macOS попросит правую кнопку → Открыть. |
| 2 | На телефоне: Настройки → О телефоне → Номер сборки ×7 → Для разработчиков → Отладка по USB. Подключить кабель или adb connect 192.168.1.42:5555. |
| 3 | Открыть. Тащить рисунок по живому экрану, колесо — размер, Shift+колесо — поворот, затем START DRAWING. |
| Размещение мышью | Тащить, менять размер, поворачивать, отражать, Fit. Хранится в долях экрана и переживает поворот телефона. |
| Слои | Несколько картинок сразу, у каждой своё положение и свои настройки трассировки. |
| Ластик по штрихам | Провести по ненужным линиям; Undo erase возвращает их. |
| Пересчёт на месте | Ползунок детализации перетрассирует загруженное — заново открывать файл не нужно. |
| Запись и повтор | Файл хранит доли экрана, поэтому воспроизводится на другом телефоне, с любой скоростью. |
| Два трассировщика | Кэнни для техники и зданий, когерентные линии по потоку для лиц и животных. Приложение спрашивает, что на картинке, а не какой алгоритм. |
| Нативные окна | WinUI 3 на Windows, SwiftUI на macOS, оба поверх одного движка. |
| Нет живого экрана? | Подойдёт снимок, снятый на телефоне вручную — важны его пропорции. |
mthread shape heart # сердце, вписанное в экран
mthread text "привет" --y 0.35 # любым шрифтом, что есть в системе
mthread record -o login.json # затем: mthread play login.json --speed 2from mthread import Device
Device().draw_paths([[(100, 200), (400, 200), (400, 600)]])
Это файлы из examples/, только уменьшенные — ничего не готовилось, не ретушировалось и не вырезалось.
adb shell input tap запускает на устройстве отдельный процесс на каждый вызов —
100–300 мс за штуку. Здесь весь рисунок уходит целиком, и штрих, который через
input swipe рисуется 40 секунд, занимает меньше секунды.
Как это устроено → (по-английски) — своя система координат у тачскрина, три пути внутрь устройства и почему свежий Pixel отказывает в самом быстром, чего стоит «мгновенно», рисование по-человечески и список открытых задач.
Командная строка
mthread devices # какие устройства подключены
mthread info # разрешение экрана и диапазоны тачскрина
mthread shape star --points 7 --rotate 20 # heart, star, circle, square, polygon, spiral, wave
mthread text "подпись" --font arial.ttf --scale 0.5 --y 0.8
mthread play session.json --speed 0.5 --repeat 3У всех команд рисования общие параметры размещения --scale, --rotate,
--flip-x, --flip-y, --x, --y, --margin и --speed/--human — как
рисовать.
Текст рисуется настоящим шрифтом и затем трассируется: поэтому доступен любой шрифт системы и поэтому буквы выходят контурами — у залитой глифы есть внутренняя и внешняя граница, а здесь рисует один палец.
Из исходников и как собрать приложения самому
run.bat на Windows и run.sh на macOS и Linux делают всё
сами: окружение, зависимости и adb, если своего нет. Вручную:
git clone https://github.com/MAXAWER/MThread-Draw.git && cd MThread-Draw
pip install -e . # только библиотека - зависимостей нет вообще
pip install -e ".[draw]" # + трассировка картинок (OpenCV, NumPy, Pillow)adb ищется в ADB_PATH, внутри собранного приложения, в вашем PATH, в папке
platform-tools рядом с рабочим каталогом, затем в обычных путях SDK — или
python tools/fetch_platform_tools.py скачает его, 7 МБ от Google.
pip install pyinstaller
python tools/build_app.py --msi # Windows: движок, интерфейс WinUI, установщик
python tools/build_macos.py --dmg # macOS: бандл и образ дискаУстановщику нужен WiX: dotnet tool install --global wix --version 5.0.2.
Ограничения и что делать, если касания попадают не туда
- Запись не знает, как был повёрнут телефон — воспроизводите в той же ориентации, в которой записывали. Само рисование ориентацию учитывает.
- У воспроизведения есть постоянная накладная стоимость — секунда-две на инжектор: штрихи и паузы точны, общая длительность нет.
- Стоп не мгновенный. Он отменяет то, что ещё не отправлено; уже полученные две секунды устройство дорисует.
- Записи старше 1.2 не переносятся между телефонами и честно об этом сообщают, а не рисуют мимо.
- Начните с
mthread info. Дальше — issue, есть шаблоны для багов и устройств. Диапазоны координат тачскрина у разных панелей разные, и починить можно только то, что видно.
Работает с любым устройством из adb devices и с эмуляторами, открывающими порт
ADB — AVD, BlueStacks, LDPlayer (:5555), Nox (:62001), MEmu (:21503).
PNG, JPEG, BMP, WebP. Python 3.9+.
AGPL-3.0 плюс коммерческая лицензия от автора. Пользоваться, менять и делиться — бесплатно, но всё, что вы распространяете или держите сервисом для других, обязано публиковать полный исходный код под AGPL, включая перекрашенную копию. Для продукта с закрытым кодом нужна коммерческая лицензия. Юридический текст: LICENSE · человеческим языком: TERMS.md · участие: CONTRIBUTING.md.
Если инструмент сэкономил вам вечер — звезда ⭐ помогает найти его другим.