Você pode ajustar uma imagem a uma forma cortada e desenhar sombras ao redor do perímetro para dar uma sensação tridimensional. Essa técnica é útil para criar designs como avatares e miniaturas de produtos ou mostrar logotipos com formas personalizadas.
Para mostrar uma imagem cortada em uma forma, faça o seguinte:
- Crie a forma.
- Corte a imagem na forma.
Resultados
Compatibilidade de versões
Essa implementação exige que o minSDK do projeto seja definido como nível da API 21 ou mais recente.
Dependências
Criar uma forma
O código a seguir cria uma forma personalizada que pode desenhar e renderizar dinamicamente um polígono arredondado:
fun RoundedPolygon.getBounds() = calculateBounds().let { Rect(it[0], it[1], it[2], it[3]) } class RoundedPolygonShape( private val polygon: RoundedPolygon, private var matrix: Matrix = Matrix() ) : Shape { private var path = Path() override fun createOutline( size: Size, layoutDirection: LayoutDirection, density: Density ): Outline { path.rewind() path = polygon.toPath().asComposePath() matrix.reset() val bounds = polygon.getBounds() val maxDimension = max(bounds.width, bounds.height) matrix.scale(size.width / maxDimension, size.height / maxDimension) matrix.translate(-bounds.left, -bounds.top) path.transform(matrix) return Outline.Generic(path) } }
Pontos principais sobre o código
RoundedPolygon.getBounds()define uma função de extensão na classeRoundedPolygonpara calcular os limites dela.- A classe
RoundedPolygonShapeimplementa a interfaceShape, permitindo definir uma forma personalizada (um polígono arredondado) no Jetpack Compose. - A forma usa um
Matrixpara gerenciar operações de escalonamento e tradução para renderização flexível. - A função
createOutline()usa um objetoRoundedPolygon, dimensiona e traduz para caber em um determinado tamanho e retorna um objetoOutlineque descreve a forma final a ser desenhada.
Cortar a imagem em uma forma
O código a seguir corta a imagem em um hexágono e adiciona uma sombra leve para dar uma sensação de profundidade:
val hexagon = remember { RoundedPolygon( 6, rounding = CornerRounding(0.2f) ) } val clip = remember(hexagon) { RoundedPolygonShape(polygon = hexagon) } Box( modifier = Modifier .clip(clip) .background(MaterialTheme.colorScheme.secondary) .size(200.dp) ) { Text( "Hello Compose", color = MaterialTheme.colorScheme.onSecondary, modifier = Modifier.align(Alignment.Center) ) }
Pontos principais sobre o código
- Os objetos
RoundedPolygoneRoundedPolygonShapesão usados para definir e aplicar um formato hexagonal à imagem. - O código usa
graphicsLayerpara adicionar uma sombra baseada em elevação à imagem. Isso cria uma sensação de profundidade e separação visual do plano de fundo. - O uso de blocos
rememberotimiza a performance, garantindo que as definições de forma e corte sejam calculadas apenas uma vez e lembradas para recomposições posteriores da interface.
Coleções que contêm este guia
Este guia faz parte das coleções de guias rápidos selecionados que abordam objetivos mais amplos de desenvolvimento para Android: