Коллеги, давайте разберем, как легко рисовать и анимировать полосатые узоры в Jetpack Compose с помощью всего лишь одной умной функции.
🔹 Основная идея
Всё строится на использовании
Brush.linearGradient() и параметра colorStops. Секрет в том, чтобы разместить две цветовые точки с разными цветами в одной позиции. Это создаст не плавный переход, а резкую границу между полосами.🔹 От простого к сложному
1. Создаем две половинки:
Brush.linearGradient(
0.0f to Color.Black, // Начало черного
0.5f to Color.Black, // Конец черного (резкий переход!)
0.5f to Color.White, // Начало белого (в той же точке)
1.0f to Color.White // Конец белого
)
2. Рисуем повторяющийся узор:
Добавляем
TileMode.Repeated и задаем размер одного повторения через start и end:start = Offset(0f, 0f),
end = Offset(20f, 0f),
tileMode = TileMode.Repeated
3. Анимируем смещением:
Двигаем начальную и конечную точки с помощью
animatedOffset — и полосы "побежали".🔹 Готовое решение: функция
Brush.stripes()Чтобы не возиться с
colorStops каждый раз, можно создать удобную функцию-расширение:fun Brush.Companion.stripes(
vararg stripes: Pair<Color, Float>, // Цвет и его "вес"
width: Float = 20f, // Ширина одного повторения
angle: Float = 45f, // Угол наклона
phase: Float = 0f // Сдвиг для анимации
): Brush { ... }
Использовать — одно удовольствие:
// Равные полосы
Brush.stripes(
Color.Pink to 1f,
Color.Transparent to 1f,
width = 10.dp.toPx(),
angle = 45f
)
// Разные ширины и цвета
Brush.stripes(
Color.Red to 1f,
Color.Blue to 2f, // В 2 раза шире
Color.Green to 1f
)
🔹 Пример анимации загрузки
val phase by rememberInfiniteTransition()
.animateFloat(0f, 1f, animationSpec = infiniteRepeatable(tween(300)))
Box(
modifier = Modifier
.fillMaxWidth()
.height(4.dp)
.drawBehind {
drawRect(
brush = Brush.stripes(
White to 1f,
Zinc900 to 1f,
width = 10.dp.toPx(),
angle = 45f,
phase = -phase // Анимируем здесь!
)
)
}
)
🔹 Итог
Техника простая, но мощная:
• Основа — резкие градиенты через
colorStops• Повторение —
TileMode.Repeated• Анимация — смещение
phase или точек• Упрощение — своя функция
Brush.stripes()Отлично подходит для индикаторов загрузки, фоновых текстур, визуальных эффектов.
#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Релиз-кандидат твоей карьеры 2026
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib
git bisect – бинарный поиск коммита, который сломал ваш кодВстроенный в Git инструмент для автоматического поиска коммита, который внёс баг или регрессию. Работает по принципу бинарного поиска — находит проблемный коммит за O(log n) шагов.
• Вы указываете «хороший» коммит (где всё работало)
• Указываете «плохой» коммит (где баг появился)
• Git автоматически перемещает вас по истории
• Вы проверяете каждый коммит и говорите «хорошо» или «плохо»
• Git находит точный коммит с ошибкой
Запуск бинарного поиска:
# Начать поиск
git bisect start
# Указать плохой коммит (обычно текущий)
git bisect bad HEAD
# Указать хороший коммит (например, тег релиза)
git bisect good v1.2.0
# Или по хешу
git bisect good abc123def|
Автоматический поиск:
# Git будет автоматически переключаться между коммитами
# После каждого переключения проверяйте наличие бага:
# Если баг ЕСТЬ в текущем коммите:
git bisect bad
# Если бага НЕТ в текущем коммите:
git bisect good
# Git продолжит поиск, пока не найдёт проблемный коммит
Скрипт для автоматической проверки:
# Создайте скрипт test.sh, который возвращает 0 если тесты проходят, 1 если падают
git bisect start HEAD v1.2.0
git bisect run ./test.sh # Git сам запустит скрипт на каждом коммите
Для мобильной разработки:
#!/bin/bash
# bisect-test.sh для iOS
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15'
if [ $? -eq 0 ]; then
exit 0 # good
else
exit 1 # bad
fi
Прервать поиск:
git bisect reset
Показать текущий статус:
git bisect status
Пометить все коммиты как проверенные:
git bisect replay
#буст #JuniorKit
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩2🥱2
Протокол
Transferable в Swift — это мощный инструмент, который позволяет вашим пользовательским типам данных легко участвовать в системных операциях, таких как перетаскивание (Drag & Drop), копирование-вставка и общий доступ. По сути, он «учит» систему, как преобразовать вашу модель в данные для передачи и как восстановить её на другом конце.🔹 Зачем это нужно?
PasteButton, ShareLink и модификаторами для Drag & Drop.🔹 Как это работает?
Суть в реализации вычисляемого свойства
transferRepresentation. Вам нужно описать, как ваш тип «экспортируется» в данные и «импортируется» обратно.Основные способы представления:
CodableRepresentation: Самый простой способ, если ваш тип уже соответствует Codable.DataRepresentation: Для преобразования объекта в бинарные данные (например, Data).FileRepresentation: Если ваш тип представляет собой файл (изображение, PDF).ProxyRepresentation: Позволяет использовать другой Transferable-тип (например, String) для представления вашего объекта в определённых контекстах.🔹 Практический пример
Допустим, у нас есть структура
Post, и мы хотим, чтобы её можно было копировать как текст.import SwiftUI
import UniformTypeIdentifiers
struct Post: Codable, Transferable {
var text: String
static var transferRepresentation: some TransferRepresentation {
DataRepresentation(contentType: .plainText) { post in
// Экспорт: Post -> Data
post.text.data(using: .utf8) ?? Data()
} importing: { data in
// Импорт: Data -> Post
let content = String(decoding: data, as: UTF8.self)
return Post(text: content)
}
// Дополнительно: можно добавить текстовое представление
ProxyRepresentation(exporting: \.noscript)
}
}
🔹 Итог и совет
Transferable ваш тип можно использовать с ShareLink(post), PasteButton(payload: post), а также сделать его перетаскиваемым с модификатором .draggable(post).Representation, который лучше всего подходит для вашей модели данных (Codable, Data, File или Proxy).Этот протокол открывает двери к гораздо более глубокой и естественной интеграции вашего приложения в экосистему iOS, iPadOS и macOS, делая взаимодействие с данными плавным и интуитивно понятным для пользователя.
#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Искусственный интеллект не только автоматизирует рутинные задачи, но и создает новые профессии, о которых еще несколько лет назад никто не слышал. Какие именно — рассказываем в этой статье.
👉 Читать статью
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Атмосфера Нового года по-айтишному 🎄
Это когда гирлянды не на окне, а за монитором, а настроение приходит с Новогодним Git Quest от SourceCraft 🎅
Что ждёт внутри:
Задания открываются по одному каждые два дня в 00:00 МСК — с 10 по 30 декабря.
Ищите их на странице квеста. Кстати, там уже доступно первое тренировочное задание.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
IOS-разработчик — удалёнка
Senior Android Developer — гибрид (Санкт-Петербург)
iOS Developer (Part-Time) — от 1 000 $, удалёнка
Android-разработчик Middle+ — до 300 000 ₽, удалёнка
Middle iOS Developer — от 300 000 ₽, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
MaterialKolor — библиотека Compose Multiplatform для создания динамических цветовых палитр Material Design 3 из любого цвета. Доступные платформы: Android, iOS, JVM (Desktop) и JavaScript/wasm (браузер). Основу этой библиотеки составляет репозиторий material-color-utilities. ||
В настоящее время это библиотека доступна только на Java, и автор хотел сделать её доступной для проектов Kotlin Multiplatform. Исходный код был взят и преобразован в библиотеку Kotlin Multiplatform.
#буст #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему счетчик корзины иногда не обновляется?
Anonymous Quiz
14%
Проблема с статическим shared экземпляром
20%
Отсутствие механизма уведомления об изменениях
10%
Неправильная работа с массивами
37%
Race condition при добавлении товаров
19%
Посмотреть ответ
Когда приложение дорастает до сотен тысяч строк, изменения в глубоком компоненте заставляют править все промежуточные функции. Они лишь передают зависимость, что превращает рефакторинг в массовую правку и создаёт технический шум.
Эту проблему решают в разных языках: Scala, Kotlin, Android. В Swift же встроенного решения нет. Поэтому команда Яндекс Браузере сделала open-source библиотеку Implicits — механизм неявной передачи зависимостей с проверкой на этапе компиляции.
В статье автор расскажет о поиске собственного подхода. Внедрение Implicits сокращает boilerplate, ускоряет рефакторинг и улучшает читаемость кода — зависимости объявляются локально там, где реально используются. Также покажет примеры из продакшен-кода Яндекс Браузера.
#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM