Introduction
This code demonstrates how to implement a press listener in Jetpack Compose. It creates a clickable circular button that displays a rotating text with a counter value. Each press on the button increments the counter by 45 degrees, with a maximum value of 360 degrees. The code utilizes various Jetpack Compose features including animations, state management, and gesture detection.
Breakdown
The code is divided into three main sections:
MainActivity: This is the standard Android activity class that sets the content of the app using
setContentwith theMainContentcomposable function.MainContent: This composable function defines the main layout of the app. It uses a
Columnto center a clickable text element vertically and horizontally.State Management:
rememberis used to create a mutable state variablecounterto track the current angle value.animateFloatAsStateanimates the rotation angle based on thecountervalue.
Click detection:
- A
pointerInputmodifier is applied to the text element. Inside this modifier,detectTapGesturesidentifies tap gestures. - The
onPresscallback withindetectTapGesturesincrements thecounterby 45 degrees, wrapping back to 0 if it reaches 360.
- A
Text and Button Styling:
- The text element displays the current counter value with a degree symbol (
\u00B0). - Various modifiers are used to style the text element like a circular button:
fillMaxWidthsets the width of the element.rotateapplies rotation based on the animatedanglevalue.clip(CircleShape)clips the element into a circle shape.backgroundsets the background color of the button.paddingadds padding around the text.
- The text element displays the current counter value with a degree symbol (
ComposablePreview: This is a preview function for the composable used for development purposes. It's currently commented out and doesn't display anything in this example.
Summary
This code effectively demonstrates how to combine state management, animations, and gesture detection to create an interactive button with a press listener in Jetpack Compose. It showcases a practical approach for handling user interaction and updating the UI accordingly.
package com.cfsuman.jetpackcompose
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MainContent()
}
}
@Composable
fun MainContent(){
Column(
modifier = Modifier
.background(Color(0xFFEDEAE0))
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
val counter = remember { mutableStateOf(0) }
val angle: Float by animateFloatAsState(
targetValue = counter.value.toFloat(),
animationSpec = tween(
durationMillis = 3000, // duration
easing = FastOutSlowInEasing
)
)
Text(
text = "Press Me : ${counter.value}\u00B0",
fontSize = 40.sp,
color = Color(0xFFFFB200),
textAlign = TextAlign.Center,
modifier = Modifier
.pointerInput(Unit) {
detectTapGestures(
onPress = {
if (counter.value == 360){
counter.value = 0
}else{
counter.value += 45
}
}
)
}
.fillMaxWidth(0.9F)
.rotate(angle)
.clip(CircleShape)
.background(Color(0xFF58111A))
.padding(25.dp)
)
}
}
@Preview
@Composable
fun ComposablePreview(){
//MainContent()
}
}
- jetpack compose - AnimateColorAsState
- jetpack compose - Infinite float animation
- jetpack compose - Animation start delay
- jetpack compose - Draw circle on canvas
- jetpack compose - Draw rectangle on canvas
- jetpack compose - Draw rounded rectangle on canvas
- jetpack compose - Canvas withTransform
- jetpack compose - Canvas inset
- jetpack compose - Draw arc on canvas
- jetpack compose - Double tap listener
- jetpack compose - Long press listener
- jetpack compose - Tap listener
- jetpack compose - Column vertical scrolling
- jetpack compose - Column border
- jetpack compose - Column spacing