Vous pouvez adapter une image à une forme découpée et dessiner des ombres autour du périmètre de la forme pour lui donner un aspect tridimensionnel. Cette technique est utile pour créer des designs tels que des avatars et des miniatures de produits, ou pour afficher des logos avec des formes personnalisées.
Pour afficher une image découpée selon une forme, vous devez procéder comme suit :
- Créez la forme.
- Découpez l'image selon la forme.
Résultats
Compatibilité des versions
Cette implémentation nécessite que le minSDK de votre projet soit défini sur le niveau d'API 21 ou supérieur.
Dépendances
Créer une forme
Le code suivant crée une forme personnalisée qui peut dessiner et afficher dynamiquement un polygone arrondi :
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) } }
Points clés concernant le code
RoundedPolygon.getBounds()définit une fonction d'extension sur la classeRoundedPolygonpour calculer ses limites.- La classe
RoundedPolygonShapeimplémente l'interfaceShape, ce qui vous permet de définir une forme personnalisée (un polygone arrondi) dans Jetpack Compose. - La forme utilise un
Matrixpour gérer les opérations de mise à l'échelle et de translation pour un rendu flexible. - La fonction
createOutline()prend un objetRoundedPolygon, le met à l'échelle et le traduit pour l'adapter à une taille donnée, puis renvoie un objetOutlinequi décrit la forme finale à dessiner.
Découper l'image selon une forme
Le code suivant recadre l'image en hexagone et ajoute une ombre portée subtile pour donner une impression de profondeur :
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) ) }
Points clés concernant le code
- Les objets
RoundedPolygonetRoundedPolygonShapesont utilisés pour définir et appliquer une forme hexagonale à l'image. - Le code utilise
graphicsLayerpour ajouter une ombre basée sur l'élévation à l'image. Cela crée une impression de profondeur et une séparation visuelle de l'arrière-plan. - L'utilisation de blocs
rememberoptimise les performances en garantissant que les définitions de forme et de découpage sont calculées une seule fois et mémorisées pour les recompositions ultérieures de l'UI.
Collections contenant ce guide
Ce guide fait partie des collections de guides de démarrage rapide organisées qui couvrent des objectifs de développement Android plus larges :