Anda dapat menyesuaikan gambar dengan bentuk yang dipangkas, dan menggambar bayangan di sekitar perimeter bentuk untuk memberikan kesan tiga dimensi. Teknik ini berguna untuk membuat desain seperti avatar dan thumbnail produk, atau menampilkan logo dengan bentuk kustom.
Untuk menampilkan gambar yang dipangkas ke bentuk, Anda harus melakukan hal berikut:
- Buat bentuk.
- Pangkas gambar ke bentuk.
Hasil
Kompatibilitas versi
Implementasi ini mengharuskan minSDK project Anda ditetapkan ke level API 21 atau yang lebih tinggi.
Dependensi
Membuat bentuk
Kode berikut membuat bentuk kustom yang dapat menggambar dan merender poligon bulat secara dinamis:
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) } }
Poin-poin penting tentang kode
RoundedPolygon.getBounds()menentukan fungsi ekstensi pada classRoundedPolygonuntuk menghitung batasnya.- Class
RoundedPolygonShapemengimplementasikan antarmukaShape, yang memungkinkan Anda menentukan bentuk kustom (poligon bulat) di Jetpack Compose. - Bentuk menggunakan
Matrixuntuk mengelola operasi penskalaan dan terjemahan untuk rendering yang fleksibel. - Fungsi
createOutline()mengambil objekRoundedPolygon, menskalakan dan menerjemahkannya agar sesuai dengan ukuran yang diberikan, serta menampilkan objekOutlineyang menjelaskan bentuk akhir yang akan digambar.
Memangkas gambar ke bentuk
Kode berikut memangkas gambar ke segi enam, dan menambahkan bayangan jatuh yang halus untuk memberikan kesan kedalaman:
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) ) }
Poin-poin penting tentang kode
- Objek
RoundedPolygondanRoundedPolygonShapedigunakan untuk menentukan dan menerapkan bentuk segi enam ke gambar. - Kode ini menggunakan
graphicsLayeruntuk menambahkan bayangan berbasis elevasi ke gambar. Hal ini menciptakan kesan kedalaman dan pemisahan visual dari latar belakang. - Penggunaan blok
remembermengoptimalkan performa dengan memastikan bahwa definisi bentuk dan pemangkasan hanya dihitung satu kali dan diingat untuk komposisi ulang UI berikutnya.
Koleksi yang berisi panduan ini
Panduan ini adalah bagian dari koleksi Panduan Singkat pilihan yang mencakup sasaran pengembangan Android yang lebih luas: