Jetpack Compose is a modern UI toolkit for building Android apps using a declarative approach. Shape in Jetpack Compose one of the key concepts for user interface, which is used to define the visual appearance of UI components.
A Shape is a geometric representation of a drawable element, such as a button or a card. It provides a set of properties that define the shape of the drawable element, including its size, corner radius, and other visual effects such as shadows or gradients.
Page Contents
Shapes in Jetpack Compose
First,
- Open Android Studio
- Create a new or open existing project
- Setup Project
build.gradle (project)
buildscript {
ext {
compose_ui_version = '1.4.0'
}
}
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
}build.gradle (module:app)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.techpassmaster.jetpackcomposeseries'
compileSdk 33
defaultConfig {
applicationId "com.techpassmaster.jetpackcomposeseries"
minSdk 24
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.4.4'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.0'
implementation "androidx.compose.ui:ui:$compose_ui_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
implementation 'androidx.compose.material:material:1.4.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"
debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"
implementation "org.jetbrains.kotlin:kotlin-script-runtime:1.8.20"
}After creating the project create a composable function, here’s an example of how to create a shape in Compose:
RectangleShape
Card(modifier = Modifier
.border(2.dp, color = Color.Blue)
.padding(16.dp)
.clickable{}
.size(100.dp),
shape = RectangleShape,
border = BorderStroke(2.dp, color = Color.Red),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "Rectangle Shape",
textAlign = TextAlign.Center)
}
}RoundedCornerShape
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp)
.graphicsLayer {
shape = RoundedCornerShape(24.dp)
clip = true
shadowElevation = 12f
},
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "RoundedCornerShape",
textAlign = TextAlign.Center)
}
}
CircleShape
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = CircleShape,
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "RoundedCornerShape",
textAlign = TextAlign.Center)
}
}AbsoluteCutCornerShape
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = AbsoluteCutCornerShape(16.dp),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "AbsoluteCutCornerShape",
textAlign = TextAlign.Center)
}
}CutCornerShape
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = CutCornerShape(
topStartPercent = 50,
bottomEndPercent = 50
),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "CutCornerShape",
textAlign = TextAlign.Center)
}
}Complete Code
package com.techpassmaster.jetpackcomposeseries
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.AbsoluteCutCornerShape
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CutCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.material.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.techpassmaster.jetpackcomposeseries.ui.theme.JetpackComposeSeriesTheme
class ShapesActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
JetpackComposeSeriesTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
ShapesInCompose()
}
}
}
}
}
@Preview
@Composable
fun ShapesInCompose() {
Column(modifier = Modifier
.padding(16.dp)
.fillMaxWidth()
.fillMaxHeight(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Card(modifier = Modifier
.border(2.dp, color = Color.Blue)
.padding(16.dp)
.clickable{}
.size(100.dp),
shape = RectangleShape,
border = BorderStroke(2.dp, color = Color.Red),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "Rectangle Shape",
textAlign = TextAlign.Center)
}
}
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp)
.graphicsLayer {
shape = RoundedCornerShape(24.dp)
clip = true
shadowElevation = 12f
},
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "RoundedCornerShape",
textAlign = TextAlign.Center)
}
}
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = CircleShape,
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "RoundedCornerShape",
textAlign = TextAlign.Center)
}
}
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = AbsoluteCutCornerShape(16.dp),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "AbsoluteCutCornerShape",
textAlign = TextAlign.Center)
}
}
Card(modifier = Modifier
.padding(top = 16.dp)
.size(100.dp),
shape = CutCornerShape(
topStartPercent = 50,
bottomEndPercent = 50
),
elevation = 12.dp
){
Box(modifier = Modifier
.padding(8.dp),
contentAlignment = Alignment.Center){
Text(text = "CutCornerShape",
textAlign = TextAlign.Center)
}
}
}
}Output


You May Also Like ⇣
- Text Padding in Jetpack Compose
- Clickable Text in Jetpack Compose
- Underline Text in Jetpack Compose
- Bold Italic Underline in Jetpack Compose
