Вы можете настраивать изображения, используя свойства composable-функции Image (contentScale, colorFilter). Также можно применять существующие модификаторы, чтобы добавлять к Image различные эффекты. Модификаторы можно использовать с любой composable-функцией, а не только с Image, тогда как contentScale и colorFilter – это явные параметры функции Image.
Масштаб контента
Укажите параметр contentScale, чтобы обрезать изображение или изменить способ его масштабирования в пределах границ. Если вы не укажете параметр contentScale, по умолчанию будет использоваться ContentScale.Fit.
В следующем примере размер composable-функции Image ограничен 150 dp, у нее есть граница, а для фона composable-функции Image задан желтый цвет, чтобы продемонстрировать различные варианты ContentScale в таблице ниже.
val imageModifier = Modifier .size(150.dp) .border(BorderStroke(1.dp, Color.Black)) .background(Color.Yellow) Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Fit, modifier = imageModifier )
Разные значения ContentScale приводят к разным результатам. В таблице ниже указано, какой режим ContentScale следует выбрать.
| Исходное изображение |
|
|
ContentScale |
Результат – вертикальное изображение: | Результат – горизонтальное изображение: |
ContentScale.Fit – равномерно масштабировать изображение, сохраняя соотношение сторон (по умолчанию). Если контент меньше указанного размера, изображение увеличивается до границ. |
|
|
ContentScale.Crop – обрезать изображение по центру, чтобы оно поместилось в доступное пространство. |
|
|
ContentScale.FillHeight: масштабировать источник с сохранением соотношения сторон, чтобы границы соответствовали высоте целевого объекта. |
|
|
ContentScale.FillWidth – масштабирование источника с сохранением соотношения сторон, чтобы границы соответствовали ширине целевого объекта. |
|
|
ContentScale.FillBounds – масштабировать контент по вертикали и горизонтали неравномерно, чтобы заполнить границы целевого объекта. Примечание. Если вы поместите изображение в контейнер, который не соответствует его пропорциям, оно будет искажено. |
|
|
ContentScale.Inside – масштабирование источника с сохранением соотношения сторон в пределах целевых границ. Если исходное изображение меньше целевого или равно ему по обоим измерениям, то оно ведет себя так же, как и None. Контент всегда будет находиться в пределах границ. Если контент меньше границ, масштабирование не применяется. |
Исходное изображение больше границ:
Исходное изображение меньше границ:
|
Исходное изображение больше границ:
Исходное изображение меньше границ:
|
ContentScale.None – не применять масштабирование к источнику. Если контент меньше целевых границ, он не будет масштабироваться по размеру области. |
Исходное изображение больше границ:
Исходное изображение меньше границ:
|
Исходное изображение больше границ:
Исходное изображение меньше границ:
|
Как обрезать composable-функцию Image по форме
Чтобы изображение соответствовало форме, используйте встроенный модификатор clip.
Чтобы обрезать изображение в форме круга, используйте Modifier.clip(CircleShape):
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(200.dp) .clip(CircleShape) )
CircleShape.Чтобы закруглить углы, используйте Modifier.clip(RoundedCornerShape(16.dp), указав размер закругления:
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(200.dp) .clip(RoundedCornerShape(16.dp)) )
RoundedCornerShape.Вы также можете создать собственную форму обрезки, расширив Shape и предоставив Path для формы, которую нужно обрезать:
class SquashedOval : Shape { override fun createOutline( size: Size, layoutDirection: LayoutDirection, density: Density ): Outline { val path = Path().apply { // We create an Oval that starts at ¼ of the width, and ends at ¾ of the width of the container. addOval( Rect( left = size.width / 4f, top = 0f, right = size.width * 3 / 4f, bottom = size.height ) ) } return Outline.Generic(path = path) } } Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(200.dp) .clip(SquashedOval()) )
Добавьте границу к composable-функции Image
Часто Modifier.border() используется вместе с Modifier.clip(), чтобы создать рамку вокруг изображения:
val borderWidth = 4.dp Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(150.dp) .border( BorderStroke(borderWidth, Color.Yellow), CircleShape ) .padding(borderWidth) .clip(CircleShape) )
Чтобы создать градиентную рамку, можно использовать API Brush и нарисовать вокруг изображения радужную градиентную рамку:
val rainbowColorsBrush = remember { Brush.sweepGradient( listOf( Color(0xFF9575CD), Color(0xFFBA68C8), Color(0xFFE57373), Color(0xFFFFB74D), Color(0xFFFFF176), Color(0xFFAED581), Color(0xFF4DD0E1), Color(0xFF9575CD) ) ) } val borderWidth = 4.dp Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(150.dp) .border( BorderStroke(borderWidth, rainbowColorsBrush), CircleShape ) .padding(borderWidth) .clip(CircleShape) )
Как задать соотношение сторон
Чтобы преобразовать изображение в пользовательское соотношение сторон, используйте Modifier.aspectRatio(16f/9f), чтобы указать пользовательское соотношение для изображения (или любого составного объекта).
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), modifier = Modifier.aspectRatio(16f / 9f) )
Modifier.aspectRatio(16f/9f) на устройстве Image.Цветовой фильтр: преобразует цвета пикселей изображения.
У composable-функции Image есть параметр colorFilter, который может менять вывод отдельных пикселей изображения.
Тонировать изображения
При использовании ColorFilter.tint(color, blendMode) к composable-функции Image применяется режим смешивания с заданным цветом. ColorFilter.tint(color, blendMode) использует BlendMode.SrcIn для тонирования контента, то есть указанный цвет показывается там, где на экране отображается изображение. Это полезно для значков и векторов, которые должны быть оформлены по-разному.
Image( painter = painterResource(id = R.drawable.baseline_directions_bus_24), contentDescription = stringResource(id = R.string.bus_content_description), colorFilter = ColorFilter.tint(Color.Yellow) )
ColorFilter.tint, примененный с помощью BlendMode.SrcIn.Другие BlendMode дают другие эффекты. Например, если задать для изображения BlendMode.Darken со значением Color.Green, получится следующий результат:
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), colorFilter = ColorFilter.tint(Color.Green, blendMode = BlendMode.Darken) )
Color.Green tint с BlendMode.Darken.Дополнительную информацию о доступных режимах смешивания можно найти в справочной документации по BlendMode.
Как применить фильтр Image с матрицей цветов
Преобразуйте изображение с помощью матрицы цветов ColorFilter. Например, чтобы применить к изображениям черно-белый фильтр, можно использовать ColorMatrix и установить насыщенность на 0f.
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }) )
Как настроить контрастность или яркость composable-функции Image
Чтобы изменить контрастность и яркость изображения, используйте ColorMatrix:
val contrast = 2f // 0f..10f (1 should be default) val brightness = -180f // -255f..255f (0 should be default) val colorMatrix = floatArrayOf( contrast, 0f, 0f, 0f, brightness, 0f, contrast, 0f, 0f, brightness, 0f, 0f, contrast, 0f, brightness, 0f, 0f, 0f, 1f, 0f ) Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), colorFilter = ColorFilter.colorMatrix(ColorMatrix(colorMatrix)) )
ColorMatrix".Инвертировать цвета composable-функции Image
Чтобы инвертировать цвета изображения, задайте для ColorMatrix инверсию цветов:
val colorMatrix = floatArrayOf( -1f, 0f, 0f, 0f, 255f, 0f, -1f, 0f, 0f, 255f, 0f, 0f, -1f, 0f, 255f, 0f, 0f, 0f, 1f, 0f ) Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), colorFilter = ColorFilter.colorMatrix(ColorMatrix(colorMatrix)) )
Как размыть composable-функцию Image
Чтобы размыть изображение, используйте Modifier.blur(), указав radiusX и radiusY, которые определяют радиус размытия по горизонтали и вертикали соответственно.
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(150.dp) .blur( radiusX = 10.dp, radiusY = 10.dp, edgeTreatment = BlurredEdgeTreatment(RoundedCornerShape(8.dp)) ) )
BlurEffect, примененный к изображению.При размытии Images рекомендуется использовать BlurredEdgeTreatment(Shape), а не BlurredEdgeTreatment.Unbounded, поскольку последний используется для размытия произвольных изображений, которые должны отображаться за пределами исходного контента. Изображения, скорее всего, не будут отображаться за пределами контента, тогда как для размытия закругленного прямоугольника может потребоваться такое различие.
Например, если для свойства BlurredEdgeTreatment задать значение Unbounded, края изображения будут размытыми, а не резкими:
Image( painter = painterResource(id = R.drawable.dog), contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier .size(150.dp) .blur( radiusX = 10.dp, radiusY = 10.dp, edgeTreatment = BlurredEdgeTreatment.Unbounded ) .clip(RoundedCornerShape(8.dp)) )
BlurEdgeTreatment.Unbounded.Рекомендуем
- Примечание. Текст ссылки показывается, когда JavaScript отключен.
- Модификаторы графики
- Загрузка изображений
- Значки Material Design
Исходное изображение меньше границ:
Исходное изображение меньше границ:
Исходное изображение меньше границ:
Исходное изображение меньше границ: