Кастомизация
Элемент extension — это блок данных, который позволяет изменять поведение и отображение элементов. Расширение можно добавлять к любому элементу.
Дополнительная логика описывается в обработчике расширения DivExtensionHandler.
Готовые расширения
|
Идентификатор |
Описание |
Исходный код |
|
|
Увеличивает элемент. |
|
|
|
||
|
|
Управляет автокоррекцией текста в элементах input (только для iOS). |
|
|
|
Исправляет проблемы с отрисовкой вне экрана в overlap контейнерах (только для iOS). |
|
|
|
Добавляет эффект размытия к элементу (только для iOS). |
|
|
|
Применяет сложные графические эффекты к фону элемента: размытие, преломление, коррекцию цвета и подсветку краев (только для Android). |
Подключение
Примечание
В качестве примера в этом разделе используется расширение Lottie.
build.gradle
dependencies {
implementation "com.yandex.div:div-pinch-to-zoom:${versions.divkit}"
implementation "com.airbnb.android:lottie:${versions.lottie}"
implementation "com.yandex.div:div-lottie:${versions.lottie}"
}
В коде:
val pinchToZoomConfiguration = DivPinchToZoomConfiguration.Builder(this)
.host(window)
.dimColor(0xFF808080.toInt())
.build()
val rawResProvider = object : DivLottieRawResProvider {
override fun provideRes(url: String): Int? {
if (url == "res://love") return R.raw.love_anim
return null
}
override fun provideAssetFile(url: String): String? {
if (url == "asset://banana") return "lottie/lottie_1.json"
return null
}
}
val divConfiguration = DivConfiguration.Builder(DefaultDivImageLoader(Container.imageManager))
.experimentConfig(experimentConfig)
.actionHandler(actionHandler)
.divLogger(logger)
.extension(DivPinchToZoomExtensionHandler(pinchToZoomConfiguration))
.extension(DivLottieExtensionHandler(rawResProvider))
.build()
val divContext = DivContext(baseContext = this, configuration = divConfiguration)
divView = DivView(divContext)
Обработчики расширений должны соответствовать протоколу DivExtensionHandler.
Для подключения обработчика передайте его в DivBlockModelingContext:
DivBlockModelingContext(
...
extensionHandlers: [
PinchToZoomExtensionHandler(overlayView: rootView),
SomeExtensionHandler()
]
)
import { lottieExtensionBuilder } from '@divkitframework/divkit/client';
import Lottie from 'lottie-web/build/player/lottie';
const map = new Map();
map.set('lottie', lottieExtensionBuilder(Lottie.loadAnimation));
render({
id: 'test',
target: element,
json: {},
extensions: map
});
Пример подключенного расширения доступен в репозитории.
Lottie в анимированном gif-изображении
Для подключения анимации к gif-изображению заполните массив extensions:
{
"extensions": [
{
"id": "lottie",
"params": {
"lottie_url": "https://assets9.lottiefiles.com/packages/lf20_edpg3c3s.json",
"repeat_count": 3,
"repeat_mode": "restart"
}
}
]
}
Примечание
Поведение параметра repeat_count
repeat_count: 0— анимация проигрывается один разrepeat_count: 1— анимация проигрывается два разаrepeat_count: N— анимация проигрывается N+1 разrepeat_count: -1— бесконечное зацикливание
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
|
|
Обязательная ссылка на Lottie JSON, если не задан параметр При использовании неподдерживаемых схем URL (не http/https/file/res) предзагрузка анимации будет пропущена с записью ошибки в лог. |
|
|
Обязательный параметр, если не задана ссылка |
|
|
Количество повторов анимации. Для бесконечного количества повторов используйте значение |
|
|
Действие после окончания анимации. Может принимать значения:
|
|
|
Минимальный кадр, с которого начинается анимация. Используется для сложных сценариев цикличного воспроизведения. |
|
|
Управляет автоматическим воспроизведением анимации при инициализации. Если установлено значение |
Управление автокоррекцией текста
Для управления автокоррекцией текста в элементах input на iOS используйте расширение input_autocorrection:
{
"extensions": [
{
"id": "input_autocorrection",
"params": {
"enabled": false
}
}
]
}
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
|
|
Управляет включением автокоррекции для поля ввода. Установите значение |
Автоматическая коррекция соотношения сторон изображений
Для автоматического кадрирования изображений в div-image до ожидаемого соотношения сторон используйте расширение aspect-correction (только для iOS):
{
"extensions": [
{
"id": "aspect-correction",
"params": {
"aspect_tolerance": 0.001
}
}
]
}
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
|
|
Допуск отклонения соотношения сторон (опционально). Если фактическое соотношение сторон отличается от ожидаемого менее чем на это значение, кадрирование не применяется. По умолчанию: 0.001. |
Особенности работы:
- Изображения кадрируются центрально при значительном отклонении от ожидаемого соотношения сторон
- Если фактическое соотношение сторон меньше ожидаемого - обрезается по высоте
- Если фактическое соотношение сторон больше ожидаемого - обрезается по ширине
- Поддерживается кэширование обработанных изображений для оптимизации производительности
Интеграция на iOS:
DivBlockModelingContext(
...
extensionHandlers: [
AspectCorrectionExtensionHandler(aspectTolerance: 0.001)
]
)
Растеризация для исправления отрисовки вне экрана
Для исправления проблем с отрисовкой вне экрана в overlap контейнерах используйте расширение rasterize (только для iOS):
{
"extensions": [
{
"id": "rasterize"
}
]
}
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
Особенности работы:
- Применяет растеризацию к блокам через
layer.shouldRasterize = true - Использует
UIScreen.main.scaleдля оптимального качества - Решает проблемы с отрисовкой вне экрана в overlap контейнерах
Интеграция на iOS:
DivBlockModelingContext(
...
extensionHandlers: [
RasterizeExtensionHandler()
]
)
Эффект размытия
Для добавления эффекта размытия к элементу используйте расширение blur (только для iOS):
{
"extensions": [
{
"id": "blur",
"params": {
"style": "regular"
}
}
]
}
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
|
|
Стиль эффекта размытия. Доступные значения:
|
Особенности работы:
- Использует системные blur-эффекты iOS (UIBlurEffect)
- Поддерживает как базовые стили, так и material-стили с вариантами для светлой и темной темы
- Применяется ко всему элементу, к которому добавлено расширение
Интеграция на iOS:
DivBlockModelingContext(
...
extensionHandlers: [
BlurExtensionHandler()
]
)
Эффекты фона
Для применения графических эффектов к фону элемента используйте расширение backdrop-effect (только для Android):
{
"extensions": [
{
"id": "backdrop-effect",
"params": {
"blur_radius": 10.0,
"refraction_height": 5.0,
"refraction_strength": 0.5,
"chromatic_aberration": 0.3,
"brightness": 1.2,
"contrast": 1.1,
"saturation": 0.9,
"rim_highlight_angle": 45.0,
"rim_highlight_fade": 0.5,
"corner_radius": 16.0,
"backdrop_scope": "card"
}
}
]
}
|
Параметры |
Описание |
|
|
Идентификатор расширения. |
|
|
Радиус размытия фона в пикселях. Опциональный параметр. |
|
|
Высота эффекта преломления. Опциональный параметр. |
|
|
Сила эффекта преломления (от 0.0 до 1.0). Опциональный параметр. |
|
|
Сила хроматической аберрации для эффекта преломления (от 0.0 до 1.0). Опциональный параметр. |
|
|
Коэффициент яркости фона. Значение 1.0 — без изменений. Опциональный параметр. |
|
|
Коэффициент контраста фона. Значение 1.0 — без изменений. Опциональный параметр. |
|
|
Коэффициент насыщенности фона. Значение 1.0 — без изменений. Опциональный параметр. |
|
|
Угол падения света для подсветки краев в градусах. Опциональный параметр. |
|
|
Коэффициент затухания подсветки краев (от 0.0 до 1.0). Опциональный параметр. |
|
|
Радиус скругления всех углов в пикселях. Опциональный параметр. |
|
|
Массив из 4 значений для индивидуального скругления углов [topLeft, topRight, bottomRight, bottomLeft]. Опциональный параметр. |
|
|
Область поиска фона для эффекта. Опциональный параметр, по умолчанию
Важно Производительность при использовании Режим захвата всего окна требует перерисовки всего дерева представлений при каждой инвалидации эффекта, что может быть ресурсоемким. Используйте этот режим только когда необходимо захватить фон за пределами текущей карточки. |
|
|
Идентификатор конкретного view для захвата фона. Если указан вместе с |
Особенности работы:
- На Android 13+ (Tiramisu) используется
RenderNodeдля оптимальной производительности - На более старых версиях Android используется
Canvasдля захвата фона - Расширение автоматически отслеживает изменения положения и состояния фонового view (скролл, layout, draw)
- Поддерживает два варианта подсветки краев: простой (
Plain) и с отражением (Reflection) для Android 13+ - Эффект корректно применяется даже к элементам без явно заданного параметра
background - Нераспознанное значение
backdrop_scopeприводит к ошибке парсинга и отключению эффекта
Интеграция на Android:
val backdropEffectHandler = BackdropEffectExtensionHandler()
val divConfiguration = DivConfiguration.Builder(imageLoader)
.extension(backdropEffectHandler)
.build()
val divContext = DivContext(baseContext = this, configuration = divConfiguration)
Для программной настройки эффектов используйте BackdropEffectDrawable:
val backdropDrawable = BackdropEffectDrawable()
backdropDrawable.setBlurEffect(radius = 10f)
backdropDrawable.setRefractionEffect(height = 5f, strength = 0.5f, chromaticAberration = 0.3f)
backdropDrawable.setColorAdjustment(brightness = 1.2f, contrast = 1.1f, saturation = 0.9f)
backdropDrawable.setRimHighlightEffect(angle = 45f, fade = 0.5f)
backdropDrawable.setCornerRadius(radius = 16f)
// Или для индивидуальных радиусов:
backdropDrawable.setCornerRadii(floatArrayOf(16f, 8f, 8f, 16f))
Пример использования с захватом фона за пределами карточки:
Пример с backdrop_scope: window
{
"extensions": [
{
"id": "backdrop-effect",
"params": {
"blur_radius": 15.0,
"backdrop_scope": "window"
}
}
]
}
Этот пример размывает весь фон окна приложения, находящийся под элементом, включая контент за пределами текущей карточки.
Узнать больше
Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.