Puoi adattare un'immagine a una forma ritagliata e disegnare ombre attorno al perimetro della forma per dare un aspetto tridimensionale. Questa tecnica è utile per creare design come avatar e miniature di prodotti o per visualizzare loghi con forme personalizzate.
Per visualizzare un'immagine ritagliata in una forma, devi:
- Creare la forma.
- Ritagliare l'immagine nella forma.
Risultati
Compatibilità delle versioni
Questa implementazione richiede che il minSDK del progetto sia impostato sul livello API 21 o superiore.
Dipendenze
Creare una forma
Il seguente codice crea una forma personalizzata che può disegnare e visualizzare dinamicamente un poligono arrotondato:
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) } }
Punti chiave sul codice
RoundedPolygon.getBounds()definisce una funzione di estensione nella classeRoundedPolygonper calcolarne i limiti.- La classe
RoundedPolygonShapeimplementa l'Shapeinterfaccia, che consente di definire una forma personalizzata (un poligono arrotondato) in Jetpack Compose. - La forma utilizza un
Matrixper gestire le operazioni di scalabilità e traslazione per un rendering flessibile. - La funzione
createOutline()accetta un oggettoRoundedPolygon, lo scala e lo traduce in modo che si adatti a una determinata dimensione e restituisce un oggettoOutlineche descrive la forma finale da disegnare.
Ritagliare l'immagine in una forma
Il seguente codice ritaglia l'immagine in un esagono e aggiunge una leggera ombra per dare un senso di profondità:
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) ) }
Punti chiave sul codice
- Gli oggetti
RoundedPolygoneRoundedPolygonShapevengono utilizzati per definire e applicare una forma esagonale all'immagine. - Il codice utilizza
graphicsLayerper aggiungere un'ombra basata sull'elevazione all'immagine. In questo modo si crea un senso di profondità e separazione visiva dallo sfondo. - L'utilizzo dei bloc0}
rememberblocchi ottimizza il rendimento assicurando che le definizioni di forma e ritaglio vengano calcolate una sola volta e memorizzate per le successive ricomposizioni dell'UI.
Raccolte che contengono questa guida
Questa guida fa parte di queste raccolte di guide rapide curate che riguardano obiettivi di sviluppo Android più ampi: